/ Hex Artifact Content
Login

Artifact 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 28 73 71 6c 69 74 65 33 5f 69  c( sz*(sqlite3_i
63e0: 6e 74 36 34 29 63 6e 74 20 29 3b 20 20 2f 2a 20  nt64)cnt );  /* 
63f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6400: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6410: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6420: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6430: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6440: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6450: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6460: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6470: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6480: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6490: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
64a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
64b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
64c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
64d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
64f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
6500: 54 72 75 65 20 3d 20 28 75 31 36 29 73 7a 3b 0a  True = (u16)sz;.
6510: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
6520: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c      int i;.    L
6530: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b  ookasideSlot *p;
6540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20  .    assert( sz 
6550: 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  > (int)sizeof(Lo
6560: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b  okasideSlot*) );
6570: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6580: 64 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a  de.nSlot = cnt;.
6590: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
65a0: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
65b0: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
65c0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
65d0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
65e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69  ->lookaside.pIni
65f0: 74 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  t;.      db->loo
6600: 6b 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70  kaside.pInit = p
6610: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
6620: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
6630: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
6640: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6650: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
6660: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6670: 44 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  Disable = 0;.   
6680: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6690: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
66a0: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
66b0: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
66c0: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b  ide.pStart = db;
66d0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
66e0: 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20  de.pEnd = db;.  
66f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6700: 62 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  bDisable = 1;.  
6710: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6720: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  sz = 0;.    db->
6730: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
6740: 63 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ced = 0;.    db-
6750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6760: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
6770: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6780: 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72  LOOKASIDE */.  r
6790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
67b0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
67c0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
67d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
67e0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
67f0: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
6800: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
6810: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
6820: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
6830: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
6840: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
6850: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
6860: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
6870: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
6880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
6890: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
68a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70  }../*.** Free up
68b0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
68c0: 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74  as we can from t
68d0: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
68e0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
68f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6900: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
6910: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
6920: 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
6930: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
6940: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
6950: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6960: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
6970: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
6980: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
6990: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
69a0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
69b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
69c0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
69d0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
69e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
69f0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6a00: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6a10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  pBt ){.      Pag
6a20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
6a30: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
6a40: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
6a50: 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50  e3PagerShrink(pP
6a60: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
6a70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6a80: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73  eaveAll(db);.  s
6a90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6aa0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6ac0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  K;.}../*.** Flus
6ad0: 68 20 61 6e 79 20 64 69 72 74 79 20 70 61 67 65  h any dirty page
6ae0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63  s in the pager-c
6af0: 61 63 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74  ache for any att
6b00: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a  ached database.*
6b10: 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  * to disk..*/.in
6b20: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63  t sqlite3_db_cac
6b30: 68 65 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20  heflush(sqlite3 
6b40: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
6b50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6b60: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e  _OK;.  int bSeen
6b70: 42 75 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65  Busy = 0;..#ifde
6b80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6b90: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
6ba0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
6bb0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
6bc0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6bd0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
6be0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6bf0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6c00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
6c10: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
6c20: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
6c30: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
6c40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
6c50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6c60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
6c70: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6c80: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
6c90: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  Bt) ){.      Pag
6ca0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
6cb0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
6cc0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
6cd0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
6ce0: 68 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  h(pPager);.     
6cf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6d00: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
6d10: 62 53 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20  bSeenBusy = 1;. 
6d20: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6d30: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
6d40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6d50: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
6d60: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
6d70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6d80: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
6d90: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ((rc==SQLITE_OK 
6da0: 26 26 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20  && bSeenBusy) ? 
6db0: 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
6dc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  );.}../*.** Conf
6dd0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e  iguration settin
6de0: 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69  gs for an indivi
6df0: 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  dual database co
6e00: 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20  nnection.*/.int 
6e10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
6e20: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  g(sqlite3 *db, i
6e30: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
6e50: 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   rc;.  va_start(
6e60: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
6e70: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
6e80: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6e90: 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a  G_MAINDBNAME: {.
6ea0: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
6eb0: 30 36 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20  06824-28531 */. 
6ec0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
6ed0: 36 32 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20  6257-52125 */.  
6ee0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a      db->aDb[0].z
6ef0: 44 62 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67  DbSName = va_arg
6f00: 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20  (ap,char*);.    
6f10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6f20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6f30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
6f40: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f  LITE_DBCONFIG_LO
6f50: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
6f60: 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61   void *pBuf = va
6f70: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
6f80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35   /* IMP: R-26835
6f90: 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20  -10964 */.      
6fa0: 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
6fb0: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20  ap, int);       
6fc0: 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d  /* IMP: R-47871-
6fd0: 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69  25994 */.      i
6fe0: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
6ff0: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f  ap, int);      /
7000: 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35  * IMP: R-04460-5
7010: 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63  3386 */.      rc
7020: 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64   = setupLookasid
7030: 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20  e(db, pBuf, sz, 
7040: 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  cnt);.      brea
7050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7060: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
7070: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
7080: 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t {.        int 
7090: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op;      /* The 
70a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
70b0: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f    u32 mask;    /
70c0: 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69  * Mask of the bi
70d0: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61  t in sqlite3.fla
70e0: 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20  gs to set/clear 
70f0: 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67  */.      } aFlag
7100: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
7110: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7120: 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20  IG_ENABLE_FKEY, 
7130: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7140: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20  _ForeignKeys    
7150: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
7160: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
7170: 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20  BLE_TRIGGER,    
7180: 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c      SQLITE_Enabl
7190: 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20  eTrigger  },.   
71a0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
71b0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 56 49  CONFIG_ENABLE_VI
71c0: 45 57 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EW,           SQ
71d0: 4c 49 54 45 5f 45 6e 61 62 6c 65 56 69 65 77 20  LITE_EnableView 
71e0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
71f0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7200: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
7210: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
7220: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
7230: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7240: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7250: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
7260: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
7270: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
7280: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
7290: 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f  NFIG_NO_CKPT_ON_
72a0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49  CLOSE,      SQLI
72b0: 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65  TE_NoCkptOnClose
72c0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
72d0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
72e0: 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20 20  NABLE_QPSG,     
72f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61        SQLITE_Ena
7300: 62 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a 20  bleQPSG     },. 
7310: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7320: 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
7330: 5f 45 51 50 2c 20 20 20 20 20 20 20 20 20 20 20  _EQP,           
7340: 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51  SQLITE_TriggerEQ
7350: 50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  P     },.       
7360: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7370: 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53  IG_RESET_DATABAS
7380: 45 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,        SQLITE
7390: 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 20 20  _ResetDatabase  
73a0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
73b0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 45 46  ITE_DBCONFIG_DEF
73c0: 45 4e 53 49 56 45 2c 20 20 20 20 20 20 20 20 20  ENSIVE,         
73d0: 20 20 20 20 53 51 4c 49 54 45 5f 44 65 66 65 6e      SQLITE_Defen
73e0: 73 69 76 65 20 20 20 20 20 20 7d 2c 0a 20 20 20  sive      },.   
73f0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7400: 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
7410: 53 43 48 45 4d 41 2c 20 20 20 20 20 20 20 53 51  SCHEMA,       SQ
7420: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
7430: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 53 51 4c 49 54 45 5f 4e 6f 53 63 68 65     SQLITE_NoSche
7470: 6d 61 45 72 72 6f 72 20 20 7d 2c 0a 20 20 20 20  maError  },.    
7480: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
7490: 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54  ONFIG_LEGACY_ALT
74a0: 45 52 5f 54 41 42 4c 45 2c 20 20 20 20 53 51 4c  ER_TABLE,    SQL
74b0: 49 54 45 5f 4c 65 67 61 63 79 41 6c 74 65 72 20  ITE_LegacyAlter 
74c0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
74d0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
74e0: 44 51 53 5f 44 44 4c 2c 20 20 20 20 20 20 20 20  DQS_DDL,        
74f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 71         SQLITE_Dq
7500: 73 44 44 4c 20 20 20 20 20 20 20 20 20 7d 2c 0a  sDDL         },.
7510: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7520: 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 4d  _DBCONFIG_DQS_DM
7530: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
7540: 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 20 20   SQLITE_DqsDML  
7550: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
7560: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7570: 46 49 47 5f 4c 45 47 41 43 59 5f 46 49 4c 45 5f  FIG_LEGACY_FILE_
7580: 46 4f 52 4d 41 54 2c 20 20 20 20 53 51 4c 49 54  FORMAT,    SQLIT
7590: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 20  E_LegacyFileFmt 
75a0: 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   },.      };.   
75b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
75c0: 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  i;.      rc = SQ
75d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49  LITE_ERROR; /* I
75e0: 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37  MP: R-42790-2337
75f0: 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  2 */.      for(i
7600: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
7610: 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a  aFlagOp); i++){.
7620: 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61          if( aFla
7630: 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b  gOp[i].op==op ){
7640: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
7650: 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70  noff = va_arg(ap
7660: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
7670: 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61    int *pRes = va
7680: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
7690: 20 20 20 20 20 20 20 20 20 20 75 36 34 20 6f 6c            u64 ol
76a0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
76b0: 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  gs;.          if
76c0: 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20  ( onoff>0 ){.   
76d0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
76e0: 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d  gs |= aFlagOp[i]
76f0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7700: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66   }else if( onoff
7710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7720: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
7730: 7e 28 75 36 34 29 61 46 6c 61 67 4f 70 5b 69 5d  ~(u64)aFlagOp[i]
7740: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7760: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
7770: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
7780: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
7790: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
77a0: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
77b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
77c0: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
77d0: 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
77e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61  = (db->flags & a
77f0: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21  FlagOp[i].mask)!
7800: 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  =0;.          }.
7810: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
7820: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
7830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7840: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7860: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
7870: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
7890: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
78a0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
78b0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
78c0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
78d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73   available..*/.s
78e0: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c  tatic int binCol
78f0: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
7900: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
7910: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7920: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7930: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7940: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
7950: 72 63 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f  rc, n;.  UNUSED_
7960: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7970: 64 29 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c  d);.  n = nKey1<
7980: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
7990: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
79a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
79b0: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
79c0: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
79d0: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
79e0: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
79f0: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
7a00: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
7a10: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
7a20: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
7a30: 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rary. */.  asser
7a40: 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79  t( pKey1 && pKey
7a50: 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  2 );.  rc = memc
7a60: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
7a70: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
7a80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
7a90: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
7aa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7ac0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
7ad0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 52 54 52 49  tion named "RTRI
7ae0: 4d 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  M" which is alwa
7af0: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
7b00: 20 20 49 67 6e 6f 72 65 20 74 72 61 69 6c 69 6e    Ignore trailin
7b10: 67 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  g spaces..*/.sta
7b20: 74 69 63 20 69 6e 74 20 72 74 72 69 6d 43 6f 6c  tic int rtrimCol
7b30: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  lFunc(.  void *p
7b40: 55 73 65 72 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  User,.  int nKey
7b50: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7b60: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7b70: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7b80: 4b 65 79 32 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  Key2.){.  const 
7b90: 75 38 20 2a 70 4b 31 20 3d 20 28 63 6f 6e 73 74  u8 *pK1 = (const
7ba0: 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f   u8*)pKey1;.  co
7bb0: 6e 73 74 20 75 38 20 2a 70 4b 32 20 3d 20 28 63  nst u8 *pK2 = (c
7bc0: 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 32 3b 0a  onst u8*)pKey2;.
7bd0: 20 20 77 68 69 6c 65 28 20 6e 4b 65 79 31 20 26    while( nKey1 &
7be0: 26 20 70 4b 31 5b 6e 4b 65 79 31 2d 31 5d 3d 3d  & pK1[nKey1-1]==
7bf0: 27 20 27 20 29 20 6e 4b 65 79 31 2d 2d 3b 0a 20  ' ' ) nKey1--;. 
7c00: 20 77 68 69 6c 65 28 20 6e 4b 65 79 32 20 26 26   while( nKey2 &&
7c10: 20 70 4b 32 5b 6e 4b 65 79 32 2d 31 5d 3d 3d 27   pK2[nKey2-1]=='
7c20: 20 27 20 29 20 6e 4b 65 79 32 2d 2d 3b 0a 20 20   ' ) nKey2--;.  
7c30: 72 65 74 75 72 6e 20 62 69 6e 43 6f 6c 6c 46 75  return binCollFu
7c40: 6e 63 28 70 55 73 65 72 2c 20 6e 4b 65 79 31 2c  nc(pUser, nKey1,
7c50: 20 70 4b 65 79 31 2c 20 6e 4b 65 79 32 2c 20 70   pKey1, nKey2, p
7c60: 4b 65 79 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Key2);.}../*.** 
7c70: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
7c80: 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65  ollSeq is the de
7c90: 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42  fault built-in B
7ca0: 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71  INARY..*/.int sq
7cb0: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f  lite3IsBinary(co
7cc0: 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b  nst CollSeq *p){
7cd0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7ce0: 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43  || p->xCmp!=binC
7cf0: 6f 6c 6c 46 75 6e 63 20 7c 7c 20 73 74 72 63 6d  ollFunc || strcm
7d00: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e 41  p(p->zName,"BINA
7d10: 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  RY")==0 );.  ret
7d20: 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78  urn p==0 || p->x
7d30: 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63  Cmp==binCollFunc
7d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7d50: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7d60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7d70: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7d80: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7d90: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7da0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7db0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7dc0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7dd0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7de0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7df0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7e00: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7e10: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7e20: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7e30: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7e40: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7e50: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7e60: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7e70: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7e80: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7e90: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7ea0: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7eb0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7ec0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7ed0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7ee0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7ef0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7f00: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7f10: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7f30: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7f40: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7f50: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7f60: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7f70: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7f80: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7f90: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7fa0: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7fb0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7fc0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7fd0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7fe0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7ff0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
8000: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
8010: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
8020: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8030: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
8040: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8050: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
8060: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
8070: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8090: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
80a0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
80b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
80c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
80d0: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
80e0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
80f0: 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  id() API functio
8100: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8110: 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65  e3_set_last_inse
8120: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
8130: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *db, sqlite3_in
8140: 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66  t64 iRowid){.#if
8150: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8160: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
8170: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8180: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
8190: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
81a0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
81b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
81c0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
81d0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
81e0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74  tex);.  db->last
81f0: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
8200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8210: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8230: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8240: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
8250: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
8260: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
8270: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
8280: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
8290: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
82a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
82b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
82c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
82d0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
82e0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
82f0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8300: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8310: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
8320: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
8330: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8340: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
8350: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
8360: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
8370: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8380: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
8390: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
83a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
83b0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
83c0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
83d0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
83e0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
83f0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8410: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8420: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
8430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8440: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
8450: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
8460: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
8470: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
8480: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
8490: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
84a0: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
84b0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
84c0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
84d0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
84e0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
84f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
8500: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
8510: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
8520: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
8530: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
8540: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
8550: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
8560: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
8570: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
8580: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8590: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
85a0: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
85b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
85c0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
85d0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
85e0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
85f0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8600: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
8610: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
8620: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
8630: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
8640: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
8650: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
8660: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
8670: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
8680: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
8690: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
86a0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
86b0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
86c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
86d0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
86e0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
86f0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
8700: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
8710: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
8720: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
8730: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
8740: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
8750: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
8760: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
8770: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8780: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8790: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
87a0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
87b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
87c0: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
87d0: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
87e0: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
87f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8800: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8810: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8820: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
8830: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
8840: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
8850: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
8860: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
8870: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
8880: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
8890: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
88a0: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
88b0: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
88c0: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
88d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
88e0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
88f0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8900: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
8910: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
8920: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8930: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8940: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8950: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8960: 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  a;.    if( pSche
8970: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ma ){.      for(
8980: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
8990: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
89a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
89b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
89c0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
89d0: 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71  ab = (Table *)sq
89e0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
89f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
8a00: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73  irtual(pTab) ) s
8a10: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
8a20: 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a  nect(db, pTab);.
8a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8a40: 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65  }.  for(p=sqlite
8a50: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8a60: 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71  Module); p; p=sq
8a70: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
8a80: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
8a90: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
8aa0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
8ab0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
8ac0: 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20  pEpoTab ){.     
8ad0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8ae0: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d  onnect(db, pMod-
8af0: 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d  >pEpoTab);.    }
8b00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
8b10: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
8b20: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
8b30: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
8b40: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
8b50: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
8b60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
8b70: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
8b80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
8b90: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
8ba0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
8bb0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8bc0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
8bd0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
8be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
8bf0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8c00: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8c10: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
8c20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8c30: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
8c40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
8c50: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
8c60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
8c70: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
8c80: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8c90: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
8ca0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
8cb0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
8cc0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
8cd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8cf0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
8d00: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
8d10: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8d20: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
8d30: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
8d40: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
8d50: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
8d60: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
8d70: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
8d80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
8d90: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
8da0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
8db0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
8dc0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
8dd0: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
8de0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8df0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
8e00: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
8e10: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
8e20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e30: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
8e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8e50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8e60: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
8e70: 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54  ->mTrace & SQLIT
8e80: 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b  E_TRACE_CLOSE ){
8e90: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
8ea0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8eb0: 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72  SE, db->pTraceAr
8ec0: 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a  g, db, 0);.  }..
8ed0: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
8ee0: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
8ef0: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
8f00: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
8f10: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
8f20: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
8f30: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
8f40: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
8f50: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
8f60: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
8f70: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
8f80: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
8f90: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
8fa0: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
8fb0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
8fc0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
8fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
8fe0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
8ff0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
9000: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
9010: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
9020: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
9030: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
9040: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
9050: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
9060: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
9070: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
9080: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
9090: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
90a0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
90b0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
90c0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
90d0: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
90e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
90f0: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
9100: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
9110: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
9120: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
9130: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
9140: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
9150: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
9160: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
9170: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
9180: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
9190: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
91a0: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
91b0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
91c0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
91d0: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
91e0: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
91f0: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
9200: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9210: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
9220: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
9230: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
9240: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
9250: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
9260: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
9270: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
9280: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
9290: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
92a0: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
92b0: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
92c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
92d0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
92e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
92f0: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
9300: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
9310: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
9320: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9330: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
9340: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
9350: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
9360: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9370: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
9380: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
9390: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
93a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
93b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
93c0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
93d0: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
93e0: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
93f0: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
9400: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
9410: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
9420: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
9430: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
9440: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
9450: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
9460: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
9470: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
9480: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
9490: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
94a0: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
94b0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
94c0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
94d0: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
94e0: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
94f0: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
9500: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
9510: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
9520: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
9530: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
9540: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
9550: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
9560: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9570: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
9580: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
9590: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
95a0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
95b0: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
95c0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
95d0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
95e0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
95f0: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
9600: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
9610: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
9620: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
9630: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
9640: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9650: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
9660: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
9670: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
9680: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
9690: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
96a0: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
96b0: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
96c0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
96d0: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
96e0: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
96f0: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
9700: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
9710: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
9720: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9730: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9740: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
9750: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
9760: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
9770: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
9790: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
97a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
97b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
97c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
97d0: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
97e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
97f0: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
9800: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
9810: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
9820: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
9830: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
9840: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
9850: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
9860: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
9870: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
9880: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
9890: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
98a0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
98b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
98c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
98d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
98e0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
98f0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
9900: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
9910: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9920: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
9930: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
9940: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
9950: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
9960: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
9970: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
9980: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
9990: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
99a0: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
99b0: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
99c0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
99d0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
99e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
99f0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
9a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
9a10: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
9a20: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
9a30: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
9a40: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
9a50: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
9a60: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
9a70: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
9a80: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
9a90: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
9aa0: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
9ab0: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
9ac0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
9ad0: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
9ae0: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
9af0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
9b00: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9b10: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
9b20: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
9b30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
9b40: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
9b50: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
9b60: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
9b70: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
9b80: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
9b90: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
9ba0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
9bb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
9bc0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
9bd0: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
9be0: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
9bf0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
9c00: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
9c10: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
9c20: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
9c30: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
9c40: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
9c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c60: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
9c70: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
9c80: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
9c90: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
9ca0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
9cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
9cc0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
9cd0: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
9ce0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
9cf0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
9d00: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
9d10: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
9d20: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
9d30: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
9d40: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
9d50: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
9d60: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
9d70: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
9d80: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
9d90: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
9da0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
9db0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
9dc0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
9dd0: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
9de0: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
9df0: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
9e00: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
9e10: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
9e20: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
9e30: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
9e40: 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
9e50: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9e60: 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Func); i; i=sqli
9e70: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9e80: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65      FuncDef *pNe
9e90: 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xt, *p;.    p = 
9ea0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9eb0: 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
9ec0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
9ed0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9ee0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
9ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9f00: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
9f10: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
9f20: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
9f30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9f40: 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63  Clear(&db->aFunc
9f50: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
9f60: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9f70: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
9f80: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9f90: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
9fa0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
9fb0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
9fc0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
9fd0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
9fe0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
9ff0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
a000: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
a010: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
a020: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
a030: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
a040: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
a050: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
a060: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
a070: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a090: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
a0a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
a0b0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
a0c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a0d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a0e0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
a0f0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
a100: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
a110: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
a120: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
a130: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
a140: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
a150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  );.    sqlite3Vt
a160: 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65  abEponymousTable
a170: 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b  Clear(db, pMod);
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
a190: 4d 6f 64 75 6c 65 55 6e 72 65 66 28 64 62 2c 20  ModuleUnref(db, 
a1a0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
a1b0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
a1c0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
a1d0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
a1e0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
a1f0: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
a200: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
a210: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
a220: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a230: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
a240: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
a250: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
a260: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
a270: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
a280: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
a290: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
a2a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a2b0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
a2c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
a2d0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
a2e0: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
a2f0: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
a300: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
a310: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
a320: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
a330: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
a340: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
a350: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
a360: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
a370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
a380: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
a390: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
a3a0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
a3b0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
a3c0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
a3d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
a3e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a3f0: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
a400: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
a410: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
a420: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
a430: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a440: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
a450: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
a460: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a470: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
a480: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a490: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
a4a0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a4b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
a4c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f  sert( sqlite3Loo
a4d0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
a4e0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
a4f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
a500: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
a510: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
a520: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
a530: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a540: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
a550: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
a560: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
a570: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
a580: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
a590: 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63  n.** any write c
a5a0: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
a5b0: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
a5c0: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
a5d0: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
a5e0: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
a5f0: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
a600: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
a610: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
a620: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
a630: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20  se that cursor. 
a640: 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65   Read cursors re
a650: 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61  main open and va
a660: 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22  lid.** but are "
a670: 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74  saved" in case t
a680: 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61  he table pages a
a690: 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e  re moved around.
a6a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a6b0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
a6c0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
a6d0: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
a6e0: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
a6f0: 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61   0;.  int schema
a700: 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
a710: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a720: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
a730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
a740: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a750: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c  ..  /* Obtain al
a760: 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  l b-tree mutexes
a770: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61   before making a
a780: 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65  ny calls to Btre
a790: 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20  eRollback(). .  
a7a0: 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  ** This is impor
a7b0: 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65  tant in case the
a7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
a7d0: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68  ng rolled back h
a7e0: 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  as.  ** modified
a7f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
a800: 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74  hema. If the b-t
a810: 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20  ree mutexes are 
a820: 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68  not taken.  ** h
a830: 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65  ere, then anothe
a840: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
a850: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20  onnection might 
a860: 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e  sneak in between
a870: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
a880: 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  se rollback and 
a890: 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68  schema reset, wh
a8a0: 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61  ich can cause fa
a8b0: 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74  lse.  ** corrupt
a8c0: 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73  ion reports in s
a8d0: 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20  ome cases.  */. 
a8e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
a8f0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68  erAll(db);.  sch
a900: 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d  emaChange = (db-
a910: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
a920: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29  AG_SchemaChange)
a930: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
a940: 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28  busy==0;..  for(
a950: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a960: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
a970: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
a980: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
a990: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a9a0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
a9b0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
a9c0: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
a9d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a9e0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
a9f0: 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63  p, tripCode, !sc
aa00: 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20  hemaChange);.   
aa10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
aa20: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
aa30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
aa40: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
aa50: 20 69 66 28 20 73 63 68 65 6d 61 43 68 61 6e 67   if( schemaChang
aa60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
aa70: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
aa80: 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b  atements(db, 0);
aa90: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
aaa0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
aab0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
aac0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
aad0: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
aae0: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
aaf0: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
ab00: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
ab10: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
ab20: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
ab30: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
ab40: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
ab50: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
ab60: 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54  s &= ~(u64)SQLIT
ab70: 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f  E_DeferFKs;..  /
ab80: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
ab90: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
aba0: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
abb0: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
abc0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
abd0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
abe0: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
abf0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
ac00: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
ac10: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
ac20: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
ac30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
ac40: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
ac50: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
ac60: 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  e name correspon
ac70: 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f  ding to the erro
ac80: 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66  r code.** specif
ac90: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
aca0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ent..*/.#if defi
acb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f  ned(SQLITE_NEED_
acc0: 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20  ERR_NAME).const 
acd0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
ace0: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
acf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ad00: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
ad10: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
ad20: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
ad30: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
ad40: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
ad50: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
ad60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
ad70: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
ad80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad90: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
ada0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
adb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adc0: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
add0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ade0: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
adf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae10: 5f 45 52 52 4f 52 5f 53 4e 41 50 53 48 4f 54 3a  _ERROR_SNAPSHOT:
ae20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae30: 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50 53  LITE_ERROR_SNAPS
ae40: 48 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  HOT";    break;.
ae50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae60: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
ae70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae80: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
ae90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aea0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aeb0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
aec0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aed0: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
aee0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
aef0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af00: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
af10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
af20: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
af30: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
af40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af50: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
af60: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
af70: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
af80: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
af90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
afa0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
afb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
afc0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
afe0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aff0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
b000: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
b010: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
b020: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
b030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b040: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
b050: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
b060: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
b070: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
b080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b090: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b0b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
b0c0: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
b0d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b0e0: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
b0f0: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
b100: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
b110: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
b120: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b130: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
b140: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
b150: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
b160: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
b170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b180: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
b190: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
b1a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b1b0: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
b1c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b1d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
b1e0: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
b1f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b200: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
b210: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
b220: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
b230: 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3a  ADONLY_CANTINIT:
b240: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b250: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
b260: 4e 49 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NIT"; break;.   
b270: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
b280: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
b290: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b2a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
b2b0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
b2c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b2d0: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
b2e0: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b2f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
b300: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
b310: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b320: 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
b330: 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ORY: zName = "SQ
b340: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49  LITE_READONLY_DI
b350: 52 45 43 54 4f 52 59 22 3b 62 72 65 61 6b 3b 0a  RECTORY";break;.
b360: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b370: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
b380: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b390: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
b3a0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
b3b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3c0: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
b3d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b400: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b410: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
b420: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b430: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
b440: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
b450: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b460: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
b470: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
b480: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b490: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
b4a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
b4c0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b4d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b4e0: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
b4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b500: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
b510: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
b520: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b530: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
b540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b550: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b560: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
b570: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b580: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
b590: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
b5b0: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
b5c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b5d0: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
b5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b5f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b600: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
b610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b620: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
b630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b640: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b650: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
b660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b670: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
b680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b690: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b6a0: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
b6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b6c0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
b6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b6f0: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
b700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b710: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
b720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b740: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
b750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b760: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
b770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b790: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
b7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b7b0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
b7c0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b7e0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b7f0: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b820: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b830: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b840: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b850: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b860: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
b870: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b880: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
b890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b8a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b8b0: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
b8c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b8d0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
b8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b8f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b900: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
b910: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b920: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b930: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b940: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b950: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b960: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b970: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b980: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b990: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9a0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b9b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b9c0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b9d0: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b9e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b9f0: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
ba00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba10: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
ba20: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
ba30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ba40: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
ba50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
ba70: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
ba80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba90: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
baa0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
bac0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
bad0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bae0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
baf0: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
bb00: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
bb10: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
bb20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb30: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
bb40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
bb60: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
bb70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
bb90: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
bba0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
bbb0: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
bbc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
bbe0: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
bbf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
bc00: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
bc10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
bc50: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
bc60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc70: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
bc80: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
bc90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
bca0: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
bcb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcc0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
bcd0: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
bce0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bcf0: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
bd00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd10: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
bd40: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
bd50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
bd70: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
bd80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd90: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
bda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bdb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
bdc0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
bdd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bde0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
bdf0: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
be00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
be10: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
be20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
be30: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
be40: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
be50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
be60: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
be70: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
be80: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
be90: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
bea0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
beb0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
bec0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
bed0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
bee0: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
bef0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf00: 5f 43 41 4e 54 4f 50 45 4e 5f 53 59 4d 4c 49 4e  _CANTOPEN_SYMLIN
bf10: 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  K:   zName = "SQ
bf20: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 53 59  LITE_CANTOPEN_SY
bf30: 4d 4c 49 4e 4b 22 3b 20 20 62 72 65 61 6b 3b 0a  MLINK";  break;.
bf40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bf50: 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20  E_PROTOCOL:     
bf60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bf70: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
bf80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bf90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bfa0: 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20  TE_EMPTY:       
bfb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bfc0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bfe0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bff0: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
c000: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c010: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
c020: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c030: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c040: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
c050: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c060: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
c070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
c080: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c090: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c0a0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
c0b0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c0c0: 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72  AINT";        br
c0d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c0e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c0f0: 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65  T_UNIQUE:  zName
c100: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c110: 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62  RAINT_UNIQUE"; b
c120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c130: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c140: 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d  NT_TRIGGER: zNam
c150: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c160: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b  TRAINT_TRIGGER";
c170: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c180: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c190: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a  INT_FOREIGNKEY:.
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c1d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
c1e0: 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  GNKEY";   break;
c1f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c200: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
c210: 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  ECK:   zName = "
c220: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c230: 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b  T_CHECK";  break
c240: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c250: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
c260: 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20  RIMARYKEY:.     
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c290: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c2a0: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
c2b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
c2c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c2d0: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
c2e0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
c2f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
c300: 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  NULL";break;.   
c310: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c320: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
c330: 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  HOOK:.          
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c360: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c370: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20  _COMMITHOOK";   
c380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c390: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c3a0: 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61  INT_VTAB:    zNa
c3b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c3c0: 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20  STRAINT_VTAB";  
c3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c3e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c3f0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  AINT_FUNCTION:. 
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c430: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
c440: 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ON";     break;.
c450: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c460: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
c470: 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ID:   zName = "S
c480: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c490: 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b  _ROWID";  break;
c4a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c4b0: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20  TE_MISMATCH:    
c4c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c4d0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22  SQLITE_MISMATCH"
c4e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
c4f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c500: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
c510: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c520: 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b  "SQLITE_MISUSE";
c530: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c540: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c550: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
c560: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c570: 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b   "SQLITE_NOLFS";
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c5a0: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
c5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c5c0: 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b  = "SQLITE_AUTH";
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
c5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c5f0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20  SQLITE_FORMAT:  
c600: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c610: 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41   = "SQLITE_FORMA
c620: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  T";            b
c630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c640: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20   SQLITE_RANGE:  
c650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47  e = "SQLITE_RANG
c670: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
c680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c690: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c6b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
c6c0: 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20  ADB";           
c6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c6e0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c700: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
c710: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
c720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c730: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c740: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
c750: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c760: 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20  OTICE";         
c770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c780: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c790: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20  CE_RECOVER_WAL: 
c7a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c7b0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
c7c0: 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  AL";break;.     
c7d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c7e0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
c7f0: 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  BACK:.          
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c820: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c830: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  OVER_ROLLBACK"; 
c840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c850: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c860: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
c870: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c880: 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20  NING";          
c890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c8a0: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
c8b0: 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e  G_AUTOINDEX:  zN
c8c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
c8d0: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22  RNING_AUTOINDEX"
c8e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c8f0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c910: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
c920: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
c930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c940: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
c950: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
c960: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
c970: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c980: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
c990: 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45  ), zBuf, "SQLITE
c9a0: 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f  _UNKNOWN(%d)", o
c9b0: 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d  rigRc);.    zNam
c9c0: 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  e = zBuf;.  }.  
c9d0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
c9e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
c9f0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
ca00: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
ca10: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
ca20: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
ca30: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
ca40: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
ca50: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
ca60: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
ca70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
ca80: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
ca90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
caa0: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
cab0: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
cac0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
cad0: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
cae0: 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20  ogic error",.   
caf0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
cb00: 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  NAL    */ 0,.   
cb10: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20   /* SQLITE_PERM 
cb20: 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73         */ "acces
cb30: 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e  s permission den
cb40: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
cb50: 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20  ITE_ABORT       
cb60: 2a 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65  */ "query aborte
cb70: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
cb80: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
cb90: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
cba0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
cbb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
cbc0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
cbd0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
cbe0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
cbf0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
cc00: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
cc10: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
cc20: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
cc30: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
cc40: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
cc50: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cc60: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
cc70: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
cc80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
cc90: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
cca0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
ccb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
ccc0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
ccd0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
cce0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
ccf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
cd00: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
cd10: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
cd20: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
cd30: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
cd40: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
cd50: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
cd60: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
cd70: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
cd80: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
cd90: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
cda0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
cdb0: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
cdc0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
cdd0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
cde0: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
cdf0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
ce00: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
ce10: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
ce20: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ce30: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
ce40: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
ce50: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
ce60: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
ce70: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
ce80: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
ce90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
cea0: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
ceb0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
cec0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
ced0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64  USE      */ "bad
cee0: 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74   parameter or ot
cef0: 68 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c  her API misuse",
cf00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
cf10: 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f  ISABLE_LFS.    /
cf20: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
cf30: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
cf40: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
cf50: 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a  isabled",.#else.
cf60: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
cf70: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  LFS       */ 0,.
cf80: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51  #endif.    /* SQ
cf90: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
cfa0: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
cfb0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
cfc0: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
cfd0: 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
cfe0: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
cff0: 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e        */ "column
d000: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
d010: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
d020: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
d030: 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20  */ "file is not 
d040: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  a database",.   
d050: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43   /* SQLITE_NOTIC
d060: 45 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 69 66  E      */ "notif
d070: 69 63 61 74 69 6f 6e 20 6d 65 73 73 61 67 65 22  ication message"
d080: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
d090: 57 41 52 4e 49 4e 47 20 20 20 20 20 2a 2f 20 22  WARNING     */ "
d0a0: 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 22  warning message"
d0b0: 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  ,.  };.  const c
d0c0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b  har *zErr = "unk
d0d0: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73  nown error";.  s
d0e0: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
d0f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
d100: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20  RT_ROLLBACK: {. 
d110: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f       zErr = "abo
d120: 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41  rt due to ROLLBA
d130: 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  CK";.      break
d140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d150: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 7b 0a 20   SQLITE_ROW: {. 
d160: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 6e 6f       zErr = "ano
d170: 74 68 65 72 20 72 6f 77 20 61 76 61 69 6c 61 62  ther row availab
d180: 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le";.      break
d190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d1a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 7b 0a   SQLITE_DONE: {.
d1b0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6e 6f        zErr = "no
d1c0: 20 6d 6f 72 65 20 72 6f 77 73 20 61 76 61 69 6c   more rows avail
d1d0: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65  able";.      bre
d1e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
d1f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
d200: 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20  c &= 0xff;.     
d210: 20 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d   if( ALWAYS(rc>=
d220: 30 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69  0) && rc<ArraySi
d230: 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67  ze(aMsg) && aMsg
d240: 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  [rc]!=0 ){.     
d250: 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72     zErr = aMsg[r
d260: 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c];.      }.    
d270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72   }.  return zErr
d290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d2a0: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
d2b0: 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  ts a busy callba
d2c0: 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61  ck that sleeps a
d2d0: 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69  nd tries.** agai
d2e0: 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75  n until a timeou
d2f0: 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68  t value is reach
d300: 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74  ed.  The timeout
d310: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20   value is.** an 
d320: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
d330: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70  f milliseconds p
d340: 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20  assed in as the 
d350: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
d360: 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
d370: 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72 65 74 72  non-zero to retr
d380: 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 52 65 74  y the lock.  Ret
d390: 75 72 6e 20 7a 65 72 6f 20 74 6f 20 73 74 6f 70  urn zero to stop
d3a0: 20 74 72 79 69 6e 67 0a 2a 2a 20 61 6e 64 20 63   trying.** and c
d3b0: 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 72  ause SQLite to r
d3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
d3d0: 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
d3e0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
d3f0: 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  syCallback(.  vo
d400: 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20  id *ptr,        
d410: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d420: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
d430: 0a 20 20 69 6e 74 20 63 6f 75 6e 74 2c 20 20 20  .  int count,   
d440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d450: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
d460: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
d470: 73 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  sy */.  sqlite3_
d480: 66 69 6c 65 20 2a 70 46 69 6c 65 20 20 20 20 20  file *pFile     
d490: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 6f 6e 20   /* The file on 
d4a0: 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 6f  which the lock o
d4b0: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 23 69  ccurred */.){.#i
d4c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
d4d0: 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  || HAVE_USLEEP. 
d4e0: 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73   /* This case is
d4f0: 20 66 6f 72 20 73 79 73 74 65 6d 73 20 74 68 61   for systems tha
d500: 74 20 68 61 76 65 20 73 75 70 70 6f 72 74 20 66  t have support f
d510: 6f 72 20 73 6c 65 65 70 69 6e 67 20 66 6f 72 20  or sleeping for 
d520: 66 72 61 63 74 69 6f 6e 73 20 6f 66 0a 20 20 2a  fractions of.  *
d530: 2a 20 61 20 73 65 63 6f 6e 64 2e 20 20 45 78 61  * a second.  Exa
d540: 6d 70 6c 65 73 3a 20 20 41 6c 6c 20 77 69 6e 64  mples:  All wind
d550: 6f 77 73 20 73 79 73 74 65 6d 73 2c 20 75 6e 69  ows systems, uni
d560: 78 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 75  x systems with u
d570: 73 6c 65 65 70 28 29 20 2a 2f 0a 20 20 73 74 61  sleep() */.  sta
d580: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c  tic const u8 del
d590: 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31  ays[] =.     { 1
d5a0: 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20  , 2, 5, 10, 15, 
d5b0: 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c  20, 25, 25,  25,
d5c0: 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d    50,  50, 100 }
d5d0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
d5e0: 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20   u8 totals[] =. 
d5f0: 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20      { 0, 1, 3,  
d600: 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37  8, 18, 33, 53, 7
d610: 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38  8, 103, 128, 178
d620: 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e  , 228 };.# defin
d630: 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69  e NDELAY ArraySi
d640: 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c  ze(delays).  sql
d650: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
d660: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
d670: 20 74 6d 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73   tmout = db->bus
d680: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20  yTimeout;.  int 
d690: 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 23  delay, prior;..#
d6a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d6b0: 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
d6c0: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  T.  if( sqlite3O
d6d0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
d6e0: 6c 65 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  le,SQLITE_FCNTL_
d6f0: 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 26 74 6d  LOCK_TIMEOUT,&tm
d700: 6f 75 74 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  out)==SQLITE_OK 
d710: 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74  ){.    if( count
d720: 20 29 7b 0a 20 20 20 20 20 20 74 6d 6f 75 74 20   ){.      tmout 
d730: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d740: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
d750: 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
d760: 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  NTL_LOCK_TIMEOUT
d770: 2c 20 26 74 6d 6f 75 74 29 3b 0a 20 20 20 20 20  , &tmout);.     
d780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
d790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d7a0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
d7b0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
d7c0: 41 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b  ARAMETER(pFile);
d7d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
d7e0: 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20  ( count>=0 );.  
d7f0: 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c  if( count < NDEL
d800: 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  AY ){.    delay 
d810: 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b  = delays[count];
d820: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
d830: 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65  als[count];.  }e
d840: 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  lse{.    delay =
d850: 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31   delays[NDELAY-1
d860: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
d870: 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20  otals[NDELAY-1] 
d880: 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28  + delay*(count-(
d890: 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a  NDELAY-1));.  }.
d8a0: 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65    if( prior + de
d8b0: 6c 61 79 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  lay > tmout ){. 
d8c0: 20 20 20 64 65 6c 61 79 20 3d 20 74 6d 6f 75 74     delay = tmout
d8d0: 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66   - prior;.    if
d8e0: 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74  ( delay<=0 ) ret
d8f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
d900: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
d910: 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30  pVfs, delay*1000
d920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
d930: 65 6c 73 65 0a 20 20 2f 2a 20 54 68 69 73 20 63  else.  /* This c
d940: 61 73 65 20 66 6f 72 20 75 6e 69 78 20 73 79 73  ase for unix sys
d950: 74 65 6d 73 20 74 68 61 74 20 6c 61 63 6b 20 75  tems that lack u
d960: 73 6c 65 65 70 28 29 20 73 75 70 70 6f 72 74 2e  sleep() support.
d970: 20 20 53 6c 65 65 70 69 6e 67 0a 20 20 2a 2a 20    Sleeping.  ** 
d980: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 69 6e 20  must be done in 
d990: 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20 77 68  increments of wh
d9a0: 6f 6c 65 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20  ole seconds */. 
d9b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
d9c0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
d9d0: 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 28 28 73   int tmout = ((s
d9e0: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
d9f0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 55 4e  usyTimeout;.  UN
da00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
da10: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 28 63 6f  File);.  if( (co
da20: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 6d  unt+1)*1000 > tm
da30: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
da40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
da50: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
da60: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
da70: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
da80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
da90: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
daa0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
dab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dac0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
dad0: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 74  eration failed t
dae0: 6f 20 61 63 71 75 69 72 65 20 61 0a 2a 2a 20 6c  o acquire a.** l
daf0: 6f 63 6b 20 6f 6e 20 56 46 53 20 66 69 6c 65 20  ock on VFS file 
db00: 70 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pFile..**.** If 
db10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
db20: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
db30: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
db40: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
db50: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
db60: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
db70: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
db80: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
db90: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
dba0: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
dbb0: 64 6c 65 72 20 2a 70 2c 20 73 71 6c 69 74 65 33  dler *p, sqlite3
dbc0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
dbd0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
dbe0: 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3d 3d  ->xBusyHandler==
dbf0: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
dc00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
dc10: 28 20 70 2d 3e 62 45 78 74 72 61 46 69 6c 65 41  ( p->bExtraFileA
dc20: 72 67 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 64  rg ){.    /* Add
dc30: 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65   an extra parame
dc40: 74 65 72 20 77 69 74 68 20 74 68 65 20 70 46 69  ter with the pFi
dc50: 6c 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  le pointer to th
dc60: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
dc70: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 72 67   ** callback arg
dc80: 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20  ument list */.  
dc90: 20 20 69 6e 74 20 28 2a 78 54 72 61 29 28 76 6f    int (*xTra)(vo
dca0: 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  id*,int,sqlite3_
dcb0: 66 69 6c 65 2a 29 3b 0a 20 20 20 20 78 54 72 61  file*);.    xTra
dcc0: 20 3d 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a   = (int(*)(void*
dcd0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c  ,int,sqlite3_fil
dce0: 65 2a 29 29 70 2d 3e 78 42 75 73 79 48 61 6e 64  e*))p->xBusyHand
dcf0: 6c 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 78 54  ler;.    rc = xT
dd00: 72 61 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20  ra(p->pBusyArg, 
dd10: 70 2d 3e 6e 42 75 73 79 2c 20 70 46 69 6c 65 29  p->nBusy, pFile)
dd20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
dd30: 2a 20 4c 65 67 61 63 79 20 73 74 79 6c 65 20 62  * Legacy style b
dd40: 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy handler call
dd50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d  back */.    rc =
dd60: 20 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72   p->xBusyHandler
dd70: 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 2d  (p->pBusyArg, p-
dd80: 3e 6e 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >nBusy);.  }.  i
dd90: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
dda0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
ddb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
ddc0: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
ddd0: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
dde0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ddf0: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
de00: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
de10: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
de20: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
de30: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
de40: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
de50: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
de60: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
de70: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
de80: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
de90: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
dea0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
deb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dec0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ded0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
dee0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
def0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
df00: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
df10: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
df20: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
df30: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
df40: 61 6e 64 6c 65 72 2e 78 42 75 73 79 48 61 6e 64  andler.xBusyHand
df50: 6c 65 72 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  ler = xBusy;.  d
df60: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
df70: 42 75 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a  BusyArg = pArg;.
df80: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
df90: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64  r.nBusy = 0;.  d
dfa0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62  b->busyHandler.b
dfb0: 45 78 74 72 61 46 69 6c 65 41 72 67 20 3d 20 30  ExtraFileArg = 0
dfc0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
dfd0: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
dfe0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
dff0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e000: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e010: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e020: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
e030: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
e040: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
e050: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
e060: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
e070: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
e080: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
e090: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
e0a0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
e0b0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
e0c0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
e0d0: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
e0e0: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
e0f0: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
e100: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
e110: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
e120: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
e130: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
e140: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
e150: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
e160: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e170: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e180: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e190: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
e1a0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e1b0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e1c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
e1d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e1e0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e1f0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
e200: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
e210: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
e220: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
e230: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
e240: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
e250: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
e260: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
e270: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
e280: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
e290: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
e2a0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
e2b0: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
e2c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
e2d0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e2e0: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
e2f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e300: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
e310: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
e320: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
e330: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
e340: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
e350: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
e360: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
e370: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
e380: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
e390: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
e3a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e3b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e3c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e3d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
e3e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
e3f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
e400: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
e410: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
e420: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 28 69  y_handler(db, (i
e430: 6e 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29  nt(*)(void*,int)
e440: 29 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75  )sqliteDefaultBu
e450: 73 79 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20  syCallback,.    
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
e480: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
e490: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
e4a0: 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c     db->busyHandl
e4b0: 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67  er.bExtraFileArg
e4c0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
e4d0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
e4e0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
e4f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e510: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
e520: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
e530: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
e540: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
e550: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
e560: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
e570: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
e580: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e590: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e5a0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
e5b0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 26 26 20 28  CheckOk(db) && (
e5c0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 67  db==0 || db->mag
e5d0: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
e5e0: 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20 20 20  _ZOMBIE) ){.    
e5f0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
e600: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
e610: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
e620: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
e630: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
e640: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e650: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
e660: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
e670: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e680: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
e690: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
e6a0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
e6b0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
e6c0: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
e6d0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
e6e0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
e6f0: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
e700: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
e710: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
e720: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
e730: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
e740: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
e750: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
e760: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
e770: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e780: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
e790: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
e7a0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e7b0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
e7c0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
e7d0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e7e0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e7f0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e800: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e810: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e820: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e830: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
e840: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
e850: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
e860: 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
e870: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e880: 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c   (*xInverse)(sql
e890: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e8a0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e8b0: 2a 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  **),.  FuncDestr
e8c0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
e8d0: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
e8e0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
e8f0: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
e900: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
e910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e920: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
e930: 20 61 73 73 65 72 74 28 20 78 56 61 6c 75 65 3d   assert( xValue=
e940: 3d 30 20 7c 7c 20 78 53 46 75 6e 63 3d 3d 30 20  =0 || xSFunc==0 
e950: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
e960: 6f 6e 4e 61 6d 65 3d 3d 30 20 20 20 20 20 20 20  onName==0       
e970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
e980: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 6e 61   have a valid na
e990: 6d 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 78 53 46  me */.   || (xSF
e9a0: 75 6e 63 21 3d 30 20 26 26 20 78 46 69 6e 61 6c  unc!=0 && xFinal
e9b0: 21 3d 30 29 20 20 20 20 20 20 20 20 2f 2a 20 4e  !=0)        /* N
e9c0: 6f 74 20 62 6f 74 68 20 78 53 46 75 6e 63 20 61  ot both xSFunc a
e9d0: 6e 64 20 78 46 69 6e 61 6c 20 2a 2f 0a 20 20 20  nd xFinal */.   
e9e0: 7c 7c 20 28 28 78 46 69 6e 61 6c 3d 3d 30 29 21  || ((xFinal==0)!
e9f0: 3d 28 78 53 74 65 70 3d 3d 30 29 29 20 20 20 20  =(xStep==0))    
ea00: 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65     /* Both or ne
ea10: 69 74 68 65 72 20 6f 66 20 78 46 69 6e 61 6c 20  ither of xFinal 
ea20: 61 6e 64 20 78 53 74 65 70 20 2a 2f 0a 20 20 20  and xStep */.   
ea30: 7c 7c 20 28 28 78 56 61 6c 75 65 3d 3d 30 29 21  || ((xValue==0)!
ea40: 3d 28 78 49 6e 76 65 72 73 65 3d 3d 30 29 29 20  =(xInverse==0)) 
ea50: 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65     /* Both or ne
ea60: 69 74 68 65 72 20 6f 66 20 78 56 61 6c 75 65 2c  ither of xValue,
ea70: 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 20   xInverse */.   
ea80: 7c 7c 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e  || (nArg<-1 || n
ea90: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
eaa0: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 0a 20 20 20  UNCTION_ARG).   
eab0: 7c 7c 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d  || (255<(nName =
eac0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ead0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  ( zFunctionName)
eae0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
eaf0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
eb00: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73  _BKPT;.  }..  as
eb10: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
eb20: 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49  C_CONSTANT==SQLI
eb30: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
eb40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
eb50: 4c 49 54 45 5f 46 55 4e 43 5f 44 49 52 45 43 54  LITE_FUNC_DIRECT
eb60: 3d 3d 53 51 4c 49 54 45 5f 44 49 52 45 43 54 4f  ==SQLITE_DIRECTO
eb70: 4e 4c 59 20 29 3b 0a 20 20 65 78 74 72 61 46 6c  NLY );.  extraFl
eb80: 61 67 73 20 3d 20 65 6e 63 20 26 20 20 28 53 51  ags = enc &  (SQ
eb90: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
eba0: 49 43 7c 53 51 4c 49 54 45 5f 44 49 52 45 43 54  IC|SQLITE_DIRECT
ebb0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 53 55 42 54  ONLY|SQLITE_SUBT
ebc0: 59 50 45 29 3b 0a 20 20 65 6e 63 20 26 3d 20 28  YPE);.  enc &= (
ebd0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
ebe0: 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b  ASK|SQLITE_ANY);
ebf0: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
ec00: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
ec10: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
ec20: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
ec30: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
ec40: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
ec50: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
ec60: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
ec70: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
ec80: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
ec90: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
eca0: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
ecb0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
ecc0: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
ecd0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
ece0: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
ecf0: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
ed00: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
ed10: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
ed20: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
ed30: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
ed40: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
ed50: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
ed60: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
ed70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
ed80: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
ed90: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
eda0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
edb0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
edc0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
edd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74   SQLITE_UTF8|ext
ede0: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
edf0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46    pUserData, xSF
ee00: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
ee10: 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76  al, xValue, xInv
ee20: 65 72 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f  erse, pDestructo
ee30: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
ee40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ee50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
ee60: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
ee70: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
ee80: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
ee90: 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  E|extraFlags,.  
eea0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
eeb0: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
eec0: 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65  , xFinal, xValue
eed0: 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73  , xInverse, pDes
eee0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
eef0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ef00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
ef10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
ef20: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
ef30: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
ef40: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
ef50: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
ef60: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
ef70: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
ef80: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
ef90: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
efa0: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
efb0: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
efc0: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
efd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
efe0: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
eff0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
f000: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
f010: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
f020: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
f030: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
f040: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
f050: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
f060: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
f070: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
f080: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
f090: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
f0a0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
f0b0: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
f0c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
f0d0: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
f0e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
f0f0: 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20  MASK)==(u32)enc 
f100: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
f110: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
f120: 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
f130: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f140: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
f150: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
f160: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
f170: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
f180: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
f190: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
f1a0: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
f1b0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
f1c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
f1d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
f1e0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
f1f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
f200: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
f210: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
f220: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
f230: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
f240: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
f250: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
f260: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
f270: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
f280: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
f290: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f2a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f2b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
f2c0: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
f2d0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
f2e0: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
f2f0: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
f300: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
f310: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
f320: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
f330: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
f340: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
f350: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
f360: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
f370: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
f380: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e  f++;.  }.  p->u.
f390: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
f3a0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
f3b0: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
f3c0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f3d0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
f3e0: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
f3f0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
f400: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
f410: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
f420: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d  ;.  testcase( p-
f430: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
f440: 49 54 45 5f 44 49 52 45 43 54 4f 4e 4c 59 20 29  ITE_DIRECTONLY )
f450: 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20  ;.  p->xSFunc = 
f460: 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20  xSFunc ? xSFunc 
f470: 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  : xStep;.  p->xF
f480: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
f490: 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20  ;.  p->xValue = 
f4a0: 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e  xValue;.  p->xIn
f4b0: 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73 65  verse = xInverse
f4c0: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
f4d0: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
f4e0: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
f4f0: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
f500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f510: 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f  * Worker functio
f520: 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d 38 20  n used by utf-8 
f530: 41 50 49 73 20 74 68 61 74 20 63 72 65 61 74 65  APIs that create
f540: 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a   new functions:.
f550: 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
f560: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
f570: 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ().**    sqlite3
f580: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
f590: 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69  _v2().**    sqli
f5a0: 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f  te3_create_windo
f5b0: 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a  w_function().*/.
f5c0: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
f5d0: 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20  eFunctionApi(.  
f5e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
f5f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
f600: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
f610: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
f620: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
f630: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
f640: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
f650: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
f660: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
f670: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
f680: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
f690: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
f6a0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
f6b0: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
f6c0: 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f  xValue)(sqlite3_
f6d0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
f6e0: 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71  d (*xInverse)(sq
f6f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f700: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f710: 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  **),.  void(*xDe
f720: 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b  stroy)(void*).){
f730: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f740: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63  TE_ERROR;.  Func
f750: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67  Destructor *pArg
f760: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
f770: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
f780: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
f790: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
f7a0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
f7c0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
f7d0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f7e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f7f0: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
f800: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
f810: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
f820: 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
f830: 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  c(sizeof(FuncDes
f840: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
f850: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
f860: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
f870: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65  t(db);.      xDe
f880: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
f890: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
f8a0: 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d      pArg->nRef =
f8b0: 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44   0;.    pArg->xD
f8c0: 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f  estroy = xDestro
f8d0: 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73  y;.    pArg->pUs
f8e0: 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a  erData = p;.  }.
f8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
f900: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
f910: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
f920: 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63 2c  , .      xSFunc,
f930: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
f940: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
f950: 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69 66  , pArg.  );.  if
f960: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
f970: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
f980: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
f990: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
f9a0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
f9b0: 69 74 65 33 5f 66 72 65 65 28 70 41 72 67 29 3b  ite3_free(pArg);
f9c0: 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63  .  }.. out:.  rc
f9d0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
f9e0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
f9f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fa00: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fa10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fa20: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
fa30: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
fa40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
fa50: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
fa60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
fa70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
fa80: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
fa90: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
faa0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
fab0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
fac0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fad0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
fae0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
faf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fb00: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fb10: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
fb20: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
fb30: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74  ntext*).){.  ret
fb40: 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69  urn createFuncti
fb50: 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c  onApi(db, zFunc,
fb60: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
fb70: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  SFunc, xStep,.  
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20    xFinal, 0, 0, 
fbb0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
fbc0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
fbd0: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
fbe0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
fbf0: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
fc00: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
fc10: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fc20: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
fc30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fc40: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fc50: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
fc60: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
fc70: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fc80: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
fc90: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
fca0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
fcb0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
fcc0: 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  oy)(void *).){. 
fcd0: 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75   return createFu
fce0: 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46  nctionApi(db, zF
fcf0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
fd00: 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  p, xSFunc, xStep
fd10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c        xFinal, 0,
fd40: 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d   0, xDestroy);.}
fd50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
fd60: 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74  ate_window_funct
fd70: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
fd80: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
fd90: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
fda0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
fdb0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
fdc0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
fdd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
fde0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fdf0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
fe00: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
fe10: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
fe20: 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f  xValue)(sqlite3_
fe30: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
fe40: 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71  d (*xInverse)(sq
fe50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fe60: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fe70: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fe80: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
fe90: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65  .){.  return cre
fea0: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64  ateFunctionApi(d
feb0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
fec0: 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65 70  enc, p, 0, xStep
fed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78 56        xFinal, xV
ff00: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20  alue, xInverse, 
ff10: 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69  xDestroy);.}..#i
ff20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ff30: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
ff40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
ff50: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
ff60: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
ff70: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
ff80: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
ff90: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
ffa0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
ffb0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
ffc0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
ffd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
ffe0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
fff0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
10000 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
10010 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
10020 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
10030 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
10040 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
10050 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66  *zFunc8;..#ifdef
10060 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
10070 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10080 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10090 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e  ckOk(db) || zFun
100a0 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72  ctionName==0 ) r
100b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
100c0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
100d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
100e0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
100f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
10100 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10110 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
10120 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
10130 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
10140 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
10150 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
10160 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
10170 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
10180 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
10190 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46   xSFunc,xStep,xF
101a0 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73  inal,0,0,0);.  s
101b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
101c0 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
101d0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
101e0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
101f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10200 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10210 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
10220 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
10230 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d  lowing is the im
10240 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10250 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  an SQL function 
10260 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66  that always.** f
10270 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72  ails with an err
10280 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61 74 69  or message stati
10290 6e 67 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  ng that the func
102a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20  tion is used in 
102b0 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e  the.** wrong con
102c0 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74  text.  The sqlit
102d0 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
102e0 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74  tion() API might
102f0 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51   construct.** SQ
10300 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  L function that 
10310 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
10320 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
10330 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73  ctions will exis
10340 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65  t.** for name re
10350 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65  solution but are
10360 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f   actually overlo
10370 61 64 65 64 20 62 79 20 74 68 65 20 78 46 69 6e  aded by the xFin
10380 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74  dFunction.** met
10390 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74  hod of virtual t
103a0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
103b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76   void sqlite3Inv
103c0 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  alidFunction(.  
103d0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
103e0 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68  *context,  /* Th
103f0 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69  e function calli
10400 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10410 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20  int NotUsed,    
10420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10430 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
10440 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
10450 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
10460 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20  alue **NotUsed2 
10470 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61    /* Value of ea
10480 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
10490 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
104a0 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
104b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  har*)sqlite3_use
104c0 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
104d0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
104e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
104f0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10500 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20  sed2);.  zErr = 
10510 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10520 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74  .      "unable t
10530 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25  o use function %
10540 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
10550 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61  ed context", zNa
10560 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  me);.  sqlite3_r
10570 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
10580 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a  ext, zErr, -1);.
10590 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
105a0 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
105b0 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
105c0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
105d0 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
105e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
105f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
10600 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
10610 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
10620 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
10630 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
10640 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
10650 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
10660 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
10670 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
10680 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
10690 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
106a0 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
106b0 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
106c0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
106d0 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
106e0 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
106f0 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
10700 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
10710 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
10720 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
10730 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
10740 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
10750 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
10760 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
10770 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
10780 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
10790 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
107a0 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
107b0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
107c0 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
107d0 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
107e0 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63  nArg.){.  int rc
107f0 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b  ;.  char *zCopy;
10800 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10810 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10820 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10830 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10840 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20   || zName==0 || 
10850 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72  nArg<-2 ){.    r
10860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10870 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
10880 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
10890 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
108a0 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71  utex);.  rc = sq
108b0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
108c0 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  n(db, zName, nAr
108d0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
108e0 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  0)!=0;.  sqlite3
108f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10900 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72  >mutex);.  if( r
10910 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  c ) return SQLIT
10920 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20  E_OK;.  zCopy = 
10930 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10940 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  zName);.  if( zC
10950 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  opy==0 ) return 
10960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10970 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
10980 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
10990 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  2(db, zName, nAr
109a0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79             zCopy
109d0 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
109e0 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
109f0 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d  sqlite3_free);.}
10a00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10a10 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
10a20 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
10a30 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
10a40 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
10a50 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
10a60 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
10a70 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
10a80 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
10a90 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
10aa0 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
10ab0 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
10ac0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
10ad0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
10ae0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
10af0 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
10b00 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
10b10 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
10b20 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nt..*/.#ifndef S
10b30 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
10b40 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69  CATED.void *sqli
10b50 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65  te3_trace(sqlite
10b60 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72  3 *db, void(*xTr
10b70 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
10b80 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
10b90 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
10ba0 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
10bb0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10bc0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10bd0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10be0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10bf0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10c00 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
10c10 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10c20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10c30 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10c40 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
10c50 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54  aceArg;.  db->mT
10c60 72 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20  race = xTrace ? 
10c70 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47  SQLITE_TRACE_LEG
10c80 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78  ACY : 0;.  db->x
10c90 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28  Trace = (int(*)(
10ca0 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  u32,void*,void*,
10cb0 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20  void*))xTrace;. 
10cc0 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
10cd0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10ce0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10cf0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10d00 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
10d10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10d20 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f  DEPRECATED */../
10d30 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
10d40 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  ce callback usin
10d50 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20  g the version-2 
10d60 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
10d70 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f  t sqlite3_trace_
10d80 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
10d90 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63   /* Trace this c
10dc0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  onnection */.  u
10dd0 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20  nsigned mTrace, 
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
10e00 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62  k of events to b
10e10 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e  e traced */.  in
10e20 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67  t(*xTrace)(unsig
10e30 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ned,void*,void*,
10e40 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c  void*),  /* Call
10e50 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a  back to invoke *
10e60 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e90 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  * Context */.){.
10ea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10eb0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10ec0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10ed0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10ee0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10ef0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10f00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10f20 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10f30 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20  if( mTrace==0 ) 
10f40 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66  xTrace = 0;.  if
10f50 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54  ( xTrace==0 ) mT
10f60 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  race = 0;.  db->
10f70 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b  mTrace = mTrace;
10f80 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
10f90 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
10fa0 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
10fb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10fc0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10fd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10fe0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
10ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
11000 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65  RECATED./*.** Re
11010 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
11020 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
11030 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
11040 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
11050 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
11060 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
11070 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
11080 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
11090 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
110a0 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
110b0 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
110c0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
110d0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
110e0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
110f0 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
11100 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
11110 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
11120 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
11130 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
11140 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
11150 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
11160 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
11170 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
11180 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
11190 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
111a0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
111b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
111c0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
111d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
111e0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
111f0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
11200 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
11210 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
11220 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
11230 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11240 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
11250 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
11260 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
11270 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
11280 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
11290 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
112a0 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c 49  ->mTrace &= SQLI
112b0 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47 41  TE_TRACE_NONLEGA
112c0 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 64  CY_MASK;.  if( d
112d0 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64 62  b->xProfile ) db
112e0 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c 49  ->mTrace |= SQLI
112f0 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49 4c  TE_TRACE_XPROFIL
11300 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  E;.  sqlite3_mut
11310 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11320 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
11330 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
11340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
11350 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66  ECATED */.#endif
11360 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11370 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
11380 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
11390 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
113a0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
113b0 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a  tion commits..**
113c0 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
113d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
113e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
113f0 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
11400 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
11410 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
11420 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
11430 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11450 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
11460 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
11470 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
11480 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
11490 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
114a0 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
114b0 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
114c0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
114d0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
114e0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
114f0 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
11500 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
11510 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11520 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
11530 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
11540 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
11550 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11560 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
11570 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
11580 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11590 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
115a0 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
115b0 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
115c0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
115d0 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
115e0 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
115f0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11600 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11610 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11620 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
11630 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
11640 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
11650 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
11660 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
11670 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
11680 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
11690 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
116a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
116b0 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
116c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116e0 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
116f0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
11700 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
11710 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
11720 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
11730 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
11740 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
11750 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
11760 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
11770 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
11780 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
11790 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
117a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
117b0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
117c0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
117d0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
117e0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
117f0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
11800 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
11810 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11820 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
11830 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
11840 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
11850 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
11860 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
11870 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
11880 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
11890 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
118a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
118b0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
118c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
118d0 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
118e0 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
118f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
11900 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
11910 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
11920 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
11930 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
11940 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
11950 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11960 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
11970 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
11980 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
11990 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
119a0 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
119b0 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
119c0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119e0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
119f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
11a00 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
11a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11a20 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
11a30 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11a40 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
11a50 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
11a60 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11a70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11a80 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11a90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11aa0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
11ab0 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
11ac0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
11ad0 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
11ae0 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
11af0 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
11b00 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
11b10 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11b20 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11b30 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  pRet;.}..#ifdef 
11b40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
11b50 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
11b60 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
11b70 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
11b80 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
11b90 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
11ba0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
11bb0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
11bc0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
11bd0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
11be0 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  *sqlite3_preupda
11bf0 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
11c00 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11c10 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
11c20 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
11c30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
11c40 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20  id(*xCallback)( 
11c50 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
11c60 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
11c70 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65      void*,sqlite
11c80 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  3*,int,char cons
11c90 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73  t*,char const*,s
11ca0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c  qlite3_int64,sql
11cb0 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76  ite3_int64),.  v
11cc0 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
11cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11ce0 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  t callback argum
11cf0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ent */.){.  void
11d00 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
11d10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11d20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
11d30 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74   = db->pPreUpdat
11d40 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65  eArg;.  db->xPre
11d50 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
11d60 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11d70 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20  ->pPreUpdateArg 
11d80 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
11d90 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11da0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11db0 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
11dc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
11dd0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
11de0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
11df0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
11e00 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
11e10 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
11e20 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
11e30 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
11e40 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
11e50 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
11e60 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
11e70 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
11e80 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
11e90 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
11ea0 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
11eb0 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
11ec0 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
11ed0 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
11ee0 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
11ef0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
11f00 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
11f10 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
11f20 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
11f30 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
11f40 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
11f50 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11f60 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
11f70 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11f80 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
11f90 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
11fa0 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
11fb0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
11fc0 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
11fd0 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
11fe0 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
11ff0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
12000 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
12010 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
12020 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
12030 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
12040 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
12050 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
12060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12070 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
12080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
12090 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
120a0 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
120b0 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
120c0 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
120d0 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
120e0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
120f0 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
12100 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
12110 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
12120 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
12130 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
12140 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
12150 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
12160 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
12170 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
12180 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
12190 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
121a0 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
121b0 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
121c0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
121d0 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
121e0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
121f0 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
12200 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
12210 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
12220 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
12230 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
12240 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
12250 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
12260 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
12270 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
12280 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
12290 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
122a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
122b0 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
122c0 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
122d0 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
122e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
122f0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
12300 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
12310 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12320 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
12330 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54  lse.#ifdef SQLIT
12340 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
12350 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
12360 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
12370 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
12380 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12390 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72  #endif.  if( nFr
123a0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
123b0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
123c0 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
123d0 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
123e0 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
123f0 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
12400 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
12410 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
12420 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
12430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12440 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
12450 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
12460 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
12470 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
12480 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
12490 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
124a0 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
124b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
124c0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
124d0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
124e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
12510 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
12520 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
12530 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
12540 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
12550 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
12560 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
12590 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
125a0 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
125b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
125c0 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
125d0 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  pRet;.#ifdef SQL
125e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
125f0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
12600 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12610 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
12620 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
12630 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
12640 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
12650 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12660 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12670 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
12680 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
12690 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
126a0 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
126b0 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
126c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
126d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
126e0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
126f0 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
12700 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12710 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
12720 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
12730 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12740 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
12750 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12770 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
12780 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12790 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
127a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
127b0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
127c0 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
127d0 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
12800 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
12810 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
12840 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
12850 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
12860 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
12870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
12880 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
12890 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
128a0 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
128b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
128c0 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
128d0 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
128e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12900 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
12910 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
12920 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
12930 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
12940 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
12950 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
12960 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12970 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
12980 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
12990 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
129a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
129b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
129c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
129d0 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
129e0 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
129f0 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
12a00 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
12a10 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
12a20 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
12a30 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
12a40 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
12a50 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12a60 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a  T_PASSIVE==0 );.
12a70 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
12a80 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
12a90 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
12aa0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12ab0 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b  NT_RESTART==2 );
12ac0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
12ad0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
12ae0 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66  NCATE==3 );.  if
12af0 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
12b00 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
12b10 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
12b20 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
12b30 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  NCATE ){.    /* 
12b40 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
12b50 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d  3996-12088 The M
12b60 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
12b70 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  be a valid check
12b80 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64  point.    ** mod
12b90 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e: */.    return
12ba0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
12bb0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
12bc0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12bd0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
12be0 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20   && zDb[0] ){.  
12bf0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
12c00 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
12c10 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  b);.  }.  if( iD
12c20 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  b<0 ){.    rc = 
12c30 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
12c40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
12c50 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
12c60 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
12c70 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
12c80 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
12c90 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c     db->busyHandl
12ca0 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
12cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
12cc0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
12cd0 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
12ce0 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
12cf0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
12d00 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
12d10 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
12d20 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   rc);..  /* If t
12d30 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
12d40 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63  ve statements, c
12d50 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75  lear the interru
12d60 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a  pt flag at this.
12d70 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a    ** point.  */.
12d80 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
12d90 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ctive==0 ){.    
12da0 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
12db0 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pted = 0;.  }.. 
12dc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12dd0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
12de0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12df0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
12e00 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
12e10 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
12e20 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
12e30 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
12e40 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
12e50 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
12e60 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
12e70 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
12e80 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
12e90 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
12ea0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
12eb0 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
12ec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12ed0 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
12ee0 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
12ef0 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
12f00 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
12f10 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
12f20 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
12f30 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
12f40 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
12f50 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12f60 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
12f70 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
12f80 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
12f90 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
12fa0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
12fb0 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
12fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
12fd0 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
12fe0 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
12ff0 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
13000 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
13010 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
13020 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
13030 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
13040 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
13050 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
13060 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
13070 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
13080 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
13090 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
130a0 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
130b0 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
130c0 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
130d0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
130e0 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
130f0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
13100 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
13110 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
13120 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
13130 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
13140 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
13150 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
13160 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
13170 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
13180 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
13190 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
131a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
131b0 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
131c0 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
131d0 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
131e0 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
131f0 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
13200 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
13210 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
13220 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
13230 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
13240 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
13250 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
13260 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
13270 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
13280 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
13290 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
132a0 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
132b0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
132c0 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
132d0 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
132e0 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
132f0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
13300 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
13310 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
13320 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54  E, FULL, RESTART
13330 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e  .** or TRUNCATE.
13340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
13350 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
13360 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
13370 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
13380 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
13390 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
133a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
133b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
133c0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
133d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
133e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
133f0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
13400 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
13410 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
13420 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
13430 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13440 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
13450 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
13460 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
13470 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13480 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
13490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
134a0 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
134b0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
134c0 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
134d0 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
134e0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
134f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
13500 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
13510 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
13520 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13530 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
13540 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
13550 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
13560 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
13570 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
13580 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
13590 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
135a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
135b0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
135c0 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
135d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
135e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
135f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13600 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13610 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
13620 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
13630 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13640 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
13650 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13660 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
13670 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
13680 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
13690 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
136a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
136b0 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
136c0 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
136d0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
136e0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
136f0 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
13700 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
13710 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
13720 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
13730 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
13740 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
13750 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
13760 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
13770 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
13780 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
13790 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
137a0 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
137b0 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
137c0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
137d0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
137e0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
137f0 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
13800 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
13810 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
13820 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
13840 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
13850 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13870 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
13890 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
138a0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
138b0 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
138e0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
138f0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13920 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13930 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
13940 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
13950 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13960 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
13970 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
13980 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
13990 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
139b0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
139c0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
13a00 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13a30 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
13a40 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
13a70 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
13a80 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
13a90 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
13aa0 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
13ab0 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
13ac0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13ad0 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
13ae0 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
13af0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
13b00 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13b10 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
13b20 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
13b30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
13b40 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13b50 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  =3.  UNUSED_PARA
13b60 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
13b70 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
13b80 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
13b90 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
13ba0 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55  TEMP_STORE>3.  U
13bb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13bc0 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  db);.  return 0;
13bd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13be0 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
13bf0 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
13c00 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
13c10 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
13c20 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
13c30 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
13c40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
13c50 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
13c60 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
13c70 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
13c80 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
13c90 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  tr(SQLITE_NOMEM_
13ca0 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  BKPT);.  }.  if(
13cb0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
13cc0 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
13cd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
13ce0 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
13cf0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
13d00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
13d10 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13d20 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
13d30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13d40 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
13d50 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
13d60 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65  OMEM_BKPT);.  }e
13d70 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73  lse{.    testcas
13d80 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  e( db->pErr==0 )
13d90 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65 72  ;.    z = db->er
13da0 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29 73  rCode ? (char*)s
13db0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13dc0 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30 3b  t(db->pErr) : 0;
13dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
13de0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13df0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
13e00 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
13e10 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
13e20 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
13e30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13e40 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13e50 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
13e60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13e70 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
13e80 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
13e90 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
13ea0 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
13eb0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
13ec0 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
13ed0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
13ee0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
13ef0 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
13f00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
13f10 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
13f20 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
13f30 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
13f40 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
13f50 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
13f60 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
13f70 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
13f80 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
13f90 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27     'b', 'a', 'd'
13fa0 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c  , ' ', 'p', 'a',
13fb0 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20   'r', 'a', 'm', 
13fc0 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27  'e', 't', 'e', '
13fd0 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27  r', ' ',.    'o'
13fe0 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 'r', ' ', 'o',
13ff0 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20   't', 'h', 'e', 
14000 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27  'r', ' ', 'A', '
14010 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20  P', 'I', ' ',.  
14020 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c    'm', 'i', 's',
14030 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20   'u', 's', 'e', 
14040 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
14050 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
14060 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
14070 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
14080 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
14090 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
140a0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
140b0 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
140c0 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
140d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
140e0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
140f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14100 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
14110 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
14120 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
14130 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
14140 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
14150 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
14160 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
14170 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
14180 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c  db, db->errCode,
14190 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
141a0 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20  b->errCode));.  
141b0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
141c0 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
141d0 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
141e0 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
141f0 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
14200 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
14210 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
14220 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
14230 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
14240 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
14250 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
14260 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
14270 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
14280 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
14290 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
142a0 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
142b0 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
142c0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
142d0 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
142e0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
142f0 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
14300 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
14310 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61    sqlite3OomClea
14320 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r(db);.  }.  sql
14330 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14340 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
14350 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
14360 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14370 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
14380 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
14390 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
143a0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
143b0 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
143c0 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
143d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
143e0 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
143f0 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
14400 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
14410 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
14420 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
14430 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
14440 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
14450 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
14460 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
14470 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14480 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
14490 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
144a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
144b0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
144c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
144d0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
144e0 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
144f0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
14500 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
14510 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
14520 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
14530 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
14540 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
14550 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
14560 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
14570 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
14580 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
14590 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
145a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
145b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
145c0 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
145d0 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
145e0 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71  _system_errno(sq
145f0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
14600 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53  turn db ? db->iS
14610 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20  ysErrno : 0;.}  
14620 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14630 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
14640 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
14650 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
14660 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
14670 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c  ument.  For now,
14680 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c   this simply cal
14690 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ls the internal 
146a0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a  sqlite3ErrStr().
146b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
146c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
146d0 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72  te3_errstr(int r
146e0 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  c){.  return sql
146f0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a  ite3ErrStr(rc);.
14700 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
14710 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
14720 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
14730 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
14740 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
14750 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
14760 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
14770 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
14780 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
14790 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
147a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
147b0 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
147c0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
147d0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
147e0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
147f0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
14800 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
14810 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
14820 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
14830 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72  enc2;.  .  asser
14840 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14850 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
14860 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
14870 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
14880 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
14890 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
148a0 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
148b0 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
148c0 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
148d0 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
148e0 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
148f0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
14900 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
14910 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
14920 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
14930 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74   enc2 = enc;.  t
14940 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
14950 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20  QLITE_UTF16 );. 
14960 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
14970 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
14980 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65  IGNED );.  if( e
14990 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
149a0 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54  6 || enc2==SQLIT
149b0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
149c0 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
149d0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
149e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32  ;.  }.  if( enc2
149f0 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  <SQLITE_UTF8 || 
14a00 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31  enc2>SQLITE_UTF1
14a10 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  6BE ){.    retur
14a20 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
14a30 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
14a40 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
14a50 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f  ll is removing o
14a60 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65  r replacing an e
14a70 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  xisting collatio
14a80 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  n .  ** sequence
14a90 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65  . If so, and the
14aa0 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
14ab0 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20  s, return busy. 
14ac0 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  If there.  ** ar
14ad0 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
14ae0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
14af0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
14b00 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
14b10 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
14b20 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
14b30 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
14b40 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
14b50 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14b60 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
14b70 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
14b80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
14b90 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
14ba0 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
14bb0 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
14bc0 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
14bd0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
14be0 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
14bf0 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
14c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
14c10 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
14c20 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
14c30 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
14c40 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   0);..    /* If 
14c50 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14c60 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
14c70 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
14c80 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
14c90 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
14ca0 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
14cb0 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
14cc0 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
14cd0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
14ce0 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
14cf0 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
14d00 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
14d10 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
14d20 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
14d30 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
14d40 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
14d50 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
14d60 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
14d70 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
14d80 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
14d90 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
14da0 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
14db0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
14dc0 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
14dd0 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
14de0 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
14df0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
14e00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
14e10 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
14e20 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
14e30 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
14e40 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
14e50 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
14e60 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
14e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
14e80 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
14e90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14ea0 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
14eb0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14ec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14ed0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14ee0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14ef0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
14f00 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
14f10 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
14f20 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14f30 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
14f40 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
14f50 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
14f60 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
14f70 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
14f80 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
14f90 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
14fa0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
14fb0 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
14fc0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14fd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14fe0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
14ff0 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
15000 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
15010 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
15020 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
15030 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
15040 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
15050 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
15060 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
15070 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
15080 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
15090 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
150a0 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
150b0 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
150c0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
150d0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
150e0 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
150f0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
15100 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
15110 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
15120 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
15130 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
15140 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
15150 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
15160 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
15170 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
15180 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
15190 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
151a0 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
151b0 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
151c0 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
151d0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
151e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
151f0 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
15200 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15210 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
15220 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
15230 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
15240 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
15250 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
15260 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
15270 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
15280 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
15290 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
152a0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
152b0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
152c0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
152d0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
152e0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
152f0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15300 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
15310 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
15320 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15330 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
15340 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
15350 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
15360 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15370 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
15380 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
15390 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
153a0 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
153b0 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
153c0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
153d0 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
153e0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
153f0 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
15400 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
15410 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15420 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
15430 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
15440 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
15450 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15460 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15470 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
15480 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
15490 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
154a0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
154b0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
154c0 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
154d0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
154e0 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
154f0 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
15500 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15510 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
15520 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
15530 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
15540 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
15550 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
15560 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
15570 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
15580 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
15590 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
155a0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
155b0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
155c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
155d0 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
155e0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
155f0 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
15600 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
15610 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
15620 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
15630 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
15640 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
15650 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
15660 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
15670 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
15680 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
15690 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
156a0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
156b0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
156c0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
156d0 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
156e0 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
156f0 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
15700 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
15710 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
15720 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
15730 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
15740 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
15750 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
15760 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
15770 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
15780 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
15790 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
157a0 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
157b0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
157c0 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
157d0 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
157e0 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
157f0 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
15800 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
15810 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
15820 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
15830 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
15840 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
15850 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
15860 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
15870 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
15880 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
15890 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
158a0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
158b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
158c0 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
158d0 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
158e0 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
158f0 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
15900 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
15910 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
15920 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
15930 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
15940 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
15950 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
15960 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
15970 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
15980 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
15990 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
159a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
159b0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
159c0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
159d0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
159e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
159f0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15a00 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
15a10 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
15a20 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
15a30 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15a40 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
15a50 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
15a60 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
15a70 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15a80 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
15a90 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
15aa0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
15ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15ac0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15ad0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
15ae0 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
15af0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
15b00 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
15b10 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15b20 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
15b30 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
15b40 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
15b50 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15b60 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
15b70 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
15b80 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
15b90 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15ba0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15bb0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
15bc0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15bd0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
15be0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15bf0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
15c00 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15c40 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
15c50 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
15c60 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15c70 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15c80 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
15c90 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
15ca0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
15cb0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15cc0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15cd0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
15ce0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
15cf0 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
15d00 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15d10 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15d20 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
15d30 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
15d40 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
15d50 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15d60 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
15d70 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
15d80 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
15d90 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
15da0 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
15db0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
15dc0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15dd0 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
15de0 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
15df0 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
15e00 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15e10 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
15e20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
15e30 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
15e40 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
15e50 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
15e60 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
15e70 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
15e80 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
15e90 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
15ea0 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
15eb0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
15ec0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15ed0 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ef0 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
15f00 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
15f10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15f20 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
15f30 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
15f40 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
15f50 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
15f60 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
15f70 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
15f80 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
15f90 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
15fa0 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
15fb0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
15fc0 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
15fd0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
15fe0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
15ff0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
16000 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
16010 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
16020 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
16030 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
16040 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
16050 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
16060 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
16070 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
16080 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
16090 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
160a0 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
160b0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
160c0 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
160d0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
160e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
160f0 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
16100 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
16110 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
16120 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
16130 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
16140 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
16150 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
16160 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
16170 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
16180 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
16190 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
161a0 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
161b0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
161c0 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
161d0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
161e0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
161f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
16200 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
16210 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
16220 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
16230 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
16240 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
16250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16260 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
16270 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
16280 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
16290 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
162a0 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
162b0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
162c0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
162d0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
162e0 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
162f0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
16300 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
16310 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
16320 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16330 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
16340 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
16350 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
16360 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
16370 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
16380 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16390 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
163a0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
163b0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
163c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
163d0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
163e0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
163f0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
16400 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
16410 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
16420 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
16430 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
16440 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
16450 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
16460 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
16470 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
16480 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
16490 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164b0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
164c0 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
164d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
164e0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
164f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
16500 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
16510 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
16520 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
16530 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
16540 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
16550 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
16580 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
16590 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
165a0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
165b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
165c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
165d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
165e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
165f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16600 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
16610 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
16620 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
16630 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
16640 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
16650 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
16660 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
16670 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
16680 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
16690 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
166a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
166b0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
166c0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
166d0 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
166e0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
166f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16700 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
16710 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
16720 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
16730 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
16740 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
16750 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
16760 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
16770 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
16780 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
167b0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
167c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
167f0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
16800 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
16810 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16820 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
16830 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
16840 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
16850 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
16860 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
16870 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
16880 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
16890 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
168a0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
168b0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
168c0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
168d0 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
168e0 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
168f0 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
16900 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
16910 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
16920 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
16930 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
16940 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
16950 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
16960 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
16970 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
16980 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
16990 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
169a0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
169b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
169c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
169d0 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
169e0 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
169f0 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
16a00 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
16a10 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
16a20 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16a30 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
16a40 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
16a50 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
16a60 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
16a70 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16a80 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
16a90 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
16aa0 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
16ab0 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
16ac0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
16ad0 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
16ae0 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
16af0 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
16b00 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
16b10 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
16b20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
16b30 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
16b40 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
16b50 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
16b60 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
16b70 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
16b80 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
16b90 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
16ba0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
16bb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
16bc0 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
16bd0 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
16be0 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
16bf0 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
16c00 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
16c10 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
16c20 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
16c30 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
16c40 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
16c50 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
16c60 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
16c70 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
16c80 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
16c90 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
16ca0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16cb0 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
16cc0 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
16cd0 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
16ce0 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
16cf0 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
16d00 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
16d10 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
16d20 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
16d30 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16d40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
16d50 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
16d60 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
16d70 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
16d80 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
16d90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16da0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
16db0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
16dc0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16dd0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16de0 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
16df0 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
16e00 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
16e10 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
16e20 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
16e30 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
16e40 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
16e50 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16e60 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
16e70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
16e80 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
16e90 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
16ea0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
16eb0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
16ec0 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
16ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16ee0 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
16ef0 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
16f00 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
16f10 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
16f20 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
16f30 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
16f40 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
16f50 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
16f60 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
16f70 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
16f80 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
16f90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
16fa0 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
16fb0 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
16fc0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
16fd0 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
16fe0 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
16ff0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
17000 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
17010 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
17020 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
17030 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
17040 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
17050 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
17060 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
17070 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
17080 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
17090 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
170a0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
170b0 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
170c0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
170d0 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66   octet==0 ){.#if
170e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
170f0 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a  LE_URI_00_ERROR.
17100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
17110 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
17120 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
17130 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
17140 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
17150 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
17160 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
17170 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
17180 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
17190 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
171a0 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
171b0 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
171c0 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
171d0 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
171e0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
171f0 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
17200 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
17210 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
17220 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
17230 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
17240 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
17250 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
17260 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
17270 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
17290 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
172a0 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
172b0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
172c0 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
172d0 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
172e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
172f0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
17300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
17310 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
17320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45           /* If E
17330 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
17340 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22  OR is defined, "
17350 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73  %00" in a URI is
17360 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
17370 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
17380 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17390 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20  ntf("unexpected 
173a0 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20  %%00 in uri");. 
173b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
173c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
173d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
173e0 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66  _uri_out;.#endif
173f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17400 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
17410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
17420 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
17430 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
17440 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
17450 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
17460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
17470 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
17480 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
17490 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
174a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
174b0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
174c0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
174d0 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
174e0 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
174f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
17500 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
17510 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
17520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
17530 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
17540 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
17550 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
17560 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
17570 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
17580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17590 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
175a0 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
175b0 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
175c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
175d0 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
175e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
175f0 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
17600 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
17610 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
17620 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
17630 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
17640 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
17650 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
17660 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
17670 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
17680 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
17690 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
176a0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
176b0 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
176c0 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
176d0 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
176e0 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
176f0 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
17700 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
17710 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
17720 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
17730 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
17740 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
17750 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
17760 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
17770 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
17780 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
17790 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
177a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
177b0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
177c0 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
177d0 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
177e0 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
177f0 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
17800 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
17810 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
17820 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
17830 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
17840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
17850 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
17860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17870 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
17880 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
17890 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
178a0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
178b0 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
178c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
178d0 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
178e0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
178f0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
17900 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
17910 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
17920 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
17930 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
17940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17950 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
17960 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
17970 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
17980 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
17990 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
179a0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
179b0 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
179c0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
179d0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
179e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
179f0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
17a00 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
17a10 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
17a20 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
17a30 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
17a40 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
17a50 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
17a60 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17a70 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
17a80 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
17a90 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
17aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17ab0 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
17ac0 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
17ad0 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
17ae0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
17af0 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
17b00 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
17b10 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
17b20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
17b30 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
17b40 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
17b50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17b60 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
17b70 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
17b80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17b90 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17ba0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
17bb0 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
17bc0 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
17bd0 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
17be0 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
17bf0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
17c00 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
17c10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
17c20 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
17c30 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17c50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17c60 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17c70 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
17c80 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
17c90 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17ca0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
17cb0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
17cc0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
17cd0 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
17ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
17cf0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
17d00 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
17d10 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
17d20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
17d30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
17d40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
17d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
17d60 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
17d70 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
17d80 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
17d90 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
17da0 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
17db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17dc0 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
17dd0 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
17de0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17df0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17e10 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17e30 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17e40 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17e50 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
17e60 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
17e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17e80 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17e90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
17ea0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
17eb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17ec0 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
17ed0 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
17ee0 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17f00 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17f10 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
17f20 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
17f30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
17f60 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
17f70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17f80 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
17f90 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
17fa0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
17fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17fc0 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
17fd0 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
17fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ff0 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
18000 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
18010 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
18020 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
18030 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
18040 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
18050 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
18060 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
18070 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b  .    if( nUri ){
18080 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  .      memcpy(zF
18090 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
180a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
180b0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
180c0 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
180d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
180e0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
180f0 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
18100 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
18110 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
18120 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
18130 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
18140 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
18150 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
18160 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
18170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
18180 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
18190 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
181a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
181b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
181c0 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
181d0 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
181e0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
181f0 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
18200 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18210 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
18220 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a  LITE_HAS_CODEC).
18230 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 55 52  /*.** Process UR
18240 49 20 66 69 6c 65 6e 61 6d 65 20 71 75 65 72 79  I filename query
18250 20 70 61 72 61 6d 65 74 65 72 73 20 72 65 6c 65   parameters rele
18260 76 61 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 69  vant to the SQLi
18270 74 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a 2a 2a  te Encryption.**
18280 20 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52 65 74   Extension.  Ret
18290 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
182a0 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
182b0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
182c0 20 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61 6e 64   are.** seen and
182d0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   return false if
182e0 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   not..*/.int sql
182f0 69 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61  ite3CodecQueryPa
18300 72 61 6d 65 74 65 72 73 28 0a 20 20 73 71 6c 69  rameters(.  sqli
18310 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
18320 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
18330 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
18340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
18350 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
18360 63 68 65 6d 61 20 69 73 20 62 65 69 6e 67 20 63  chema is being c
18370 72 65 61 74 65 64 2f 61 74 74 61 63 68 65 64 20  reated/attached 
18380 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18390 2a 7a 55 72 69 20 20 20 20 20 20 20 2f 2a 20 55  *zUri       /* U
183a0 52 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29  RI filename */.)
183b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
183c0 7a 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a 4b 65  zKey;.  if( (zKe
183d0 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
183e0 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20  parameter(zUri, 
183f0 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26 26  "hexkey"))!=0 &&
18400 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20   zKey[0] ){.    
18410 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 69 6e  u8 iByte;.    in
18420 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44  t i;.    char zD
18430 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20  ecoded[40];.    
18440 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30  for(i=0, iByte=0
18450 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f  ; i<sizeof(zDeco
18460 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65  ded)*2 && sqlite
18470 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69  3Isxdigit(zKey[i
18480 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
18490 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
184a0 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
184b0 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20  oInt(zKey[i]);. 
184c0 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d       if( (i&1)!=
184d0 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32  0 ) zDecoded[i/2
184e0 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 7d  ] = iByte;.    }
184f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  .    sqlite3_key
18500 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 44 65  _v2(db, zDb, zDe
18510 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20  coded, i/2);.   
18520 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
18530 73 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73  se if( (zKey = s
18540 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
18550 65 74 65 72 28 7a 55 72 69 2c 20 22 6b 65 79 22  eter(zUri, "key"
18560 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
18570 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
18580 7a 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74  zDb, zKey, sqlit
18590 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29  e3Strlen30(zKey)
185a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
185b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b  .  }else if( (zK
185c0 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ey = sqlite3_uri
185d0 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c  _parameter(zUri,
185e0 20 22 74 65 78 74 6b 65 79 22 29 29 21 3d 30 20   "textkey"))!=0 
185f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
18600 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
18610 4b 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  Key, -1);.    re
18620 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
18630 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18640 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
18650 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18660 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
18670 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
18680 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
18690 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
186a0 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
186b0 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
186c0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
186d0 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
186e0 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
186f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18700 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
18710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
18720 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
18730 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
18740 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
18750 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
18760 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
18770 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
18780 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
18790 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
187a0 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
187b0 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
187c0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
187d0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
187e0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
187f0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
18800 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
18810 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
18820 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
18830 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
18840 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18860 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
18870 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18890 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
188a0 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
188b0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
188c0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
188d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
188e0 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
188f0 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
18900 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
18910 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
18920 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
18930 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
18940 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
18950 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
18960 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
18970 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
18980 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18990 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
189a0 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
189b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
189c0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
189d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
189e0 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
189f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18a00 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
18a10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18a20 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
18a30 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
18a40 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
18a50 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
18a60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
18a70 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
18a80 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
18a90 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
18aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
18ab0 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
18ac0 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
18ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
18ae0 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
18af0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
18b00 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a  FullMutex;.  }..
18b10 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
18b20 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
18b30 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
18b40 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
18b50 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
18b60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
18b70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18b80 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
18b90 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
18ba0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
18bb0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
18bc0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
18bd0 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
18be0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
18bf0 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
18c00 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
18c10 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
18c20 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
18c30 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
18c40 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
18c50 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
18c60 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
18c70 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
18c80 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
18c90 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
18ca0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
18cb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18cc0 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
18cd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18ce0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  E, SQLITE_OPEN_C
18cf0 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  REATE, SQLITE_OP
18d00 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a  EN_SHAREDCACHE,.
18d10 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
18d20 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61  _PRIVATECACHE, a
18d30 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64  nd some reserved
18d40 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79   bits.  Silently
18d50 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61   mask.  ** off a
18d60 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a  ll other flags..
18d70 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20    */.  flags &= 
18d80 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
18d90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
18dc0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
18dd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18de0 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
18df0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18e00 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
18e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18e20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
18e30 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
18e40 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18e50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18e60 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
18e70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18e80 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
18e90 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
18ea0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
18eb0 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
18ec0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18ed0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
18ee0 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20  URNAL |.        
18ef0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18f00 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20  EN_NOMUTEX |.   
18f10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18f20 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18f30 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
18f40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
18f50 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
18f60 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18f70 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
18f80 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
18f90 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
18fa0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
18fb0 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
18fc0 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
18fd0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
18fe0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 0a 23   isThreadsafe .#
18ff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19000 42 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45  BLE_MULTITHREADE
19010 44 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73  D_CHECKS.   || s
19020 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19030 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65  ig.bCoreMutex.#e
19040 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62  ndif.  ){.    db
19050 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
19060 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
19070 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
19080 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
19090 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
190a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
190b0 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
190c0 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
190d0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
190e0 20 20 20 20 69 66 28 20 69 73 54 68 72 65 61 64      if( isThread
190f0 73 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  safe==0 ){.     
19100 20 73 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72   sqlite3MutexWar
19110 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62  nOnContention(db
19120 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
19130 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
19140 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19150 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
19160 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
19170 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
19180 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
19190 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
191a0 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
191b0 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c 6f 6f  tatic;.  db->loo
191c0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
191d0 3d 20 31 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 1;.  db->looka
191e0 73 69 64 65 2e 73 7a 20 3d 20 30 3b 0a 0a 20 20  side.sz = 0;..  
191f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
19200 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
19210 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
19220 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
19230 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
19240 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
19250 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
19260 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
19270 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
19280 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
19290 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
192a0 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
192b0 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
192c0 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
192d0 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
192e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
192f0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
19300 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
19310 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
19320 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
19330 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
19340 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
19350 72 74 43 6f 6c 4e 61 6d 65 73 0a 20 20 20 20 20  rtColNames.     
19360 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19370 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
19380 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
19390 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61      | SQLITE_Ena
193a0 62 6c 65 56 69 65 77 0a 20 20 20 20 20 20 20 20  bleView.        
193b0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
193c0 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 0a 2f 2a  E_CacheSpill../*
193d0 20 54 68 65 20 53 51 4c 49 54 45 5f 44 51 53 20   The SQLITE_DQS 
193e0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
193f0 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ion determines t
19400 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
19410 6e 67 73 0a 2a 2a 20 66 6f 72 20 53 51 4c 49 54  ngs.** for SQLIT
19420 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44  E_DBCONFIG_DQS_D
19430 44 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 44 42  DL and SQLITE_DB
19440 43 4f 4e 46 49 47 5f 44 51 53 5f 44 4d 4c 2e 0a  CONFIG_DQS_DML..
19450 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
19460 44 51 53 20 20 20 20 20 53 51 4c 49 54 45 5f 44  DQS     SQLITE_D
19470 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20  BCONFIG_DQS_DDL 
19480 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
19490 49 47 5f 44 51 53 5f 44 4d 4c 0a 2a 2a 20 20 20  IG_DQS_DML.**   
194a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20   ----------     
194b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
194c0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
194d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
194e0 2d 2d 0a 2a 2a 20 20 20 20 20 75 6e 64 65 66 69  --.**     undefi
194f0 6e 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ned             
19500 20 20 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20    on            
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
19520 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 33     .**         3
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 6f 6e 20 20 20 20 20 20 20 20 20 20 20     on           
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
19560 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 32 20 20  n.**         2  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20   on             
19590 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 0a              off.
195a0 2a 2a 20 20 20 20 20 20 20 20 20 31 20 20 20 20  **         1    
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
195c0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
195d0 20 20 20 20 20 20 20 20 20 20 20 6f 6e 0a 2a 2a             on.**
195e0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
195f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 20              off 
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 20 20 20 6f 66 66 0a 2a 2a 0a 2a          off.**.*
19620 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
19630 72 20 69 73 20 33 20 28 64 6f 75 62 6c 65 2d 71  r is 3 (double-q
19640 75 6f 74 65 64 20 73 74 72 69 6e 67 20 6c 69 74  uoted string lit
19650 65 72 61 6c 73 20 61 72 65 20 61 6c 6c 6f 77 65  erals are allowe
19660 64 20 61 6e 79 77 68 65 72 65 29 0a 2a 2a 20 61  d anywhere).** a
19670 6e 64 20 73 6f 20 74 68 61 74 20 69 73 20 74 68  nd so that is th
19680 65 20 64 65 66 61 75 6c 74 2e 20 20 42 75 74 20  e default.  But 
19690 64 65 76 65 6c 6f 70 65 72 73 20 61 72 65 20 65  developers are e
196a0 6e 63 6f 75 72 61 6e 67 65 64 20 74 6f 20 75 73  ncouranged to us
196b0 65 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 44 51  e.** -DSQLITE_DQ
196c0 53 3d 30 20 28 62 65 73 74 29 20 6f 72 20 2d 44  S=0 (best) or -D
196d0 53 51 4c 49 54 45 5f 44 51 53 3d 31 20 28 73 65  SQLITE_DQS=1 (se
196e0 63 6f 6e 64 20 63 68 6f 69 63 65 29 20 69 66 20  cond choice) if 
196f0 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 69 66  possible..*/.#if
19700 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19710 5f 44 51 53 29 0a 23 20 64 65 66 69 6e 65 20 53  _DQS).# define S
19720 51 4c 49 54 45 5f 44 51 53 20 33 0a 23 65 6e 64  QLITE_DQS 3.#end
19730 69 66 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 44  if.#if (SQLITE_D
19740 51 53 26 31 29 3d 3d 31 0a 20 20 20 20 20 20 20  QS&1)==1.       
19750 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19760 54 45 5f 44 71 73 44 4d 4c 0a 23 65 6e 64 69 66  TE_DqsDML.#endif
19770 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 44 51 53  .#if (SQLITE_DQS
19780 26 32 29 3d 3d 32 0a 20 20 20 20 20 20 20 20 20  &2)==2.         
19790 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
197a0 5f 44 71 73 44 44 4c 0a 23 65 6e 64 69 66 0a 0a  _DqsDDL.#endif..
197b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
197c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
197d0 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
197e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
197f0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19810 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
19820 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
19830 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50  LITE_DEFAULT_CKP
19840 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20  TFULLFSYNC.     
19850 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19860 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79  LITE_CkptFullFSy
19870 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  nc.#endif.#if SQ
19880 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
19890 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
198a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
198b0 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
198c0 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
198d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
198e0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19900 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
19910 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
19920 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19930 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
19940 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
19950 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
19960 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
19970 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19980 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
19990 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
199a0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
199b0 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
199c0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
199d0 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
199e0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
199f0 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f  (SQLITE_REVERSE_
19a00 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54  UNORDERED_SELECT
19a10 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
19a20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76      | SQLITE_Rev
19a30 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66  erseOrder.#endif
19a40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19a50 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
19a60 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   | SQLITE_CellSi
19a90 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20  zeCk.#endif.#if 
19aa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19ab0 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
19ac0 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20  IZER).          
19ad0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19ae0 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65  Fts3Tokenizer.#e
19af0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19b00 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51  (SQLITE_ENABLE_Q
19b10 50 53 47 29 0a 20 20 20 20 20 20 20 20 20 20 20  PSG).           
19b20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45        | SQLITE_E
19b30 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66  nableQPSG.#endif
19b40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19b50 49 54 45 5f 44 45 46 41 55 4c 54 5f 44 45 46 45  ITE_DEFAULT_DEFE
19b60 4e 53 49 56 45 29 0a 20 20 20 20 20 20 20 20 20  NSIVE).         
19b70 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19b80 5f 44 65 66 65 6e 73 69 76 65 0a 23 65 6e 64 69  _Defensive.#endi
19b90 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
19ba0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
19bb0 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
19bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19bd0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
19be0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
19bf0 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
19c00 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
19c10 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
19c20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
19c30 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
19c40 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
19c50 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
19c60 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
19c70 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
19c80 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
19c90 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
19ca0 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
19cb0 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
19cc0 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
19cd0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
19ce0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44  ..  **.  ** EVID
19cf0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36  ENCE-OF: R-52786
19d00 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65  -44878 SQLite de
19d10 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c  fines three buil
19d20 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  t-in collating. 
19d30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20   ** functions:. 
19d40 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
19d50 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
19d60 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
19d70 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
19d80 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
19d90 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19da0 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
19db0 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
19dc0 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
19dd0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19de0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
19df0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
19e00 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
19e10 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
19e20 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
19e30 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
19e40 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
19e50 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
19e60 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20  tingFunc, 0);.  
19e70 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
19e80 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
19e90 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 74 72  ITE_UTF8, 0, rtr
19ea0 69 6d 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  imCollFunc, 0);.
19eb0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19ec0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19ed0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19ee0 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45   }.  /* EVIDENCE
19ef0 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32  -OF: R-08308-172
19f00 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63  24 The default c
19f10 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
19f20 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73  n for all.  ** s
19f30 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59  trings is BINARY
19f40 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44  . .  */.  db->pD
19f50 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
19f60 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
19f70 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71   SQLITE_UTF8, sq
19f80 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19f90 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
19fa0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
19fb0 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
19fc0 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
19fd0 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a 20 20 2a  rgument.  **.  *
19fe0 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
19ff0 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
1a000 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
1a010 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
1a020 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
1a030 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
1a040 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
1a050 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
1a060 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
1a070 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
1a080 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
1a090 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
1a0a0 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
1a0b0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
1a0c0 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
1a0d0 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
1a0e0 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
1a0f0 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
1a100 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1a110 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
1a120 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1a130 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
1a140 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1a150 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1a160 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 64  _CREATE.  */.  d
1a170 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
1a180 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20  lags;.  assert( 
1a190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1a1a0 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
1a1b0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
1a1c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1a1d0 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
1a1e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
1a1f0 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
1a200 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
1a210 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
1a220 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
1a230 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
1a240 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
1a250 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
1a260 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
1a270 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
1a280 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
1a290 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
1a2a0 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
1a2b0 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
1a2c0 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20   & 0x46)==0 ){. 
1a2d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d     rc = SQLITE_M
1a2e0 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20  ISUSE_BKPT;  /* 
1a2f0 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35  IMP: R-65497-445
1a300 39 34 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  94 */.  }else{. 
1a310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a320 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
1a330 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
1a340 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
1a350 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
1a360 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1a370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1a380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
1a390 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46  EM ) sqlite3OomF
1a3a0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73 71  ault(db);.    sq
1a3b0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
1a3c0 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73  g(db, rc, zErrMs
1a3d0 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45  g ? "%s" : 0, zE
1a3e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
1a3f0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1a400 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
1a410 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
1a420 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
1a430 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
1a440 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
1a450 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1a460 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64  ->pVfs, zOpen, d
1a470 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  b, &db->aDb[0].p
1a480 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Bt, 0,.         
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1a4a0 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
1a4b0 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69  EN_MAIN_DB);.  i
1a4c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a4d0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
1a4e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1a4f0 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
1a500 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1a510 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
1a520 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
1a530 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  c);.    goto ope
1a540 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73  ndb_out;.  }.  s
1a550 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a560 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
1a570 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ;.  db->aDb[0].p
1a580 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
1a590 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
1a5a0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
1a5b0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a5c0 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29  Failed ) ENC(db)
1a5d0 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62   = SCHEMA_ENC(db
1a5e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a5f0 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30  eLeave(db->aDb[0
1a600 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
1a610 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
1a620 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
1a630 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, 0);..  /* Th
1a640 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
1a650 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
1a660 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
1a670 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74 65  FULL; for the te
1a680 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
1a690 20 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69 73   it is OFF. This
1a6a0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
1a6b0 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
1a6c0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
1a6d0 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
1a6e0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
1a6f0 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
1a700 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  vel = SQLITE_DEF
1a710 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
1a720 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  +1;.  db->aDb[1]
1a730 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d  .zDbSName = "tem
1a740 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
1a750 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
1a760 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
1a770 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61  S_OFF;..  db->ma
1a780 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1a790 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
1a7a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a7b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
1a7c0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
1a7d0 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
1a7e0 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
1a7f0 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
1a800 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
1a810 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1a820 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
1a830 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
1a840 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
1a850 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1a860 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
1a870 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
1a880 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
1a890 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  K);.  sqlite3Reg
1a8a0 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69  isterPerConnecti
1a8b0 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  onBuiltinFunctio
1a8c0 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ns(db);.  rc = s
1a8d0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
1a8e0 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  b);..#ifdef SQLI
1a8f0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20  TE_ENABLE_FTS5. 
1a900 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e 79   /* Register any
1a910 20 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d   built-in FTS5 m
1a920 6f 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61  odule before loa
1a930 64 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ding the automat
1a940 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f  ic.  ** extensio
1a950 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ns. This allows 
1a960 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
1a970 69 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65 72  ions to register
1a980 20 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65   FTS5 .  ** toke
1a990 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69 6c  nizers and auxil
1a9a0 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20  iary functions. 
1a9b0 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
1a9c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1a9d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a9f0 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts5Init(db);.  
1aa00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c  }.#endif..  /* L
1aa10 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
1aa20 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
1aa30 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
1aa40 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
1aa50 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
1aa60 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
1aa70 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
1aa80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1aa90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aaa0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
1aab0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
1aac0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1aad0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
1aae0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aaf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1ab00 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
1ab10 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1ab20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
1ab30 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
1ab40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1ab50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
1ab60 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
1ab70 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
1ab80 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
1ab90 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1aba0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1abb0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
1abc0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1abd0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1abe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
1abf0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
1ac00 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
1ac10 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1ac20 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
1ac30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1ac40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ac50 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61  E_FTS3 /* automa
1ac60 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20  tically defined 
1ac70 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  by SQLITE_ENABLE
1ac80 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21  _FTS4 */.  if( !
1ac90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1aca0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1acb0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1acc0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
1acd0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1ace0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1acf0 45 5f 45 4e 41 42 4c 45 5f 49 43 55 29 20 7c 7c  E_ENABLE_ICU) ||
1ad00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ad10 45 4e 41 42 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41  ENABLE_ICU_COLLA
1ad20 54 49 4f 4e 53 29 0a 20 20 69 66 28 20 21 64 62  TIONS).  if( !db
1ad30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1ad40 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1ad50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ad60 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
1ad70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1ad80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ad90 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
1ada0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1adb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1adc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1add0 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
1ade0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1adf0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ae00 45 5f 44 42 50 41 47 45 5f 56 54 41 42 0a 20 20  E_DBPAGE_VTAB.  
1ae10 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1ae20 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1ae30 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
1ae40 3d 20 73 71 6c 69 74 65 33 44 62 70 61 67 65 52  = sqlite3DbpageR
1ae50 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d  egister(db);.  }
1ae60 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ae70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
1ae80 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20  STAT_VTAB.  if( 
1ae90 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1aea0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1aeb0 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
1aec0 6c 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73  lite3DbstatRegis
1aed0 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ter(db);.  }.#en
1aee0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1aef0 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a  TE_ENABLE_JSON1.
1af00 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1af10 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1af20 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1af30 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31  c = sqlite3Json1
1af40 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1af50 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1af60 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56  ITE_ENABLE_STMTV
1af70 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TAB.  if( !db->m
1af80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1af90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
1afa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
1afb0 74 6d 74 56 74 61 62 49 6e 69 74 28 64 62 29 3b  tmtVtabInit(db);
1afc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1afd0 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
1afe0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
1aff0 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
1b000 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
1b010 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
1b020 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
1b030 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
1b040 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
1b050 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
1b060 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
1b070 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
1b080 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
1b090 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
1b0a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1b0b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
1b0c0 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
1b0d0 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
1b0e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1b0f0 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
1b100 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
1b110 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
1b120 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
1b130 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
1b160 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
1b170 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
1b180 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
1b190 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
1b1a0 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
1b1b0 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
1b1c0 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
1b1d0 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
1b1e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b1f0 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
1b200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b210 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b220 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
1b230 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71  ookaside);..  sq
1b240 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
1b250 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c  eckpoint(db, SQL
1b260 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
1b270 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b  AUTOCHECKPOINT);
1b280 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
1b290 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
1b2a0 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
1b2b0 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
1b2c0 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  fe==0.          
1b2d0 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
1b2e0 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
1b2f0 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
1b300 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b310 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
1b320 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1b330 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61  errcode(db);.  a
1b340 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20  ssert( db!=0 || 
1b350 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1b360 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1b370 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1b380 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1b390 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
1b3a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21  .  }else if( rc!
1b3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3c0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1b3d0 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b  LITE_MAGIC_SICK;
1b3e0 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
1b3f0 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
1b400 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
1b410 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1b420 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
1b430 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
1b440 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
1b450 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
1b460 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
1b470 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
1b480 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1b490 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
1b4a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
1b4b0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
1b4c0 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
1b4d0 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
1b4e0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1b4f0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
1b500 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EC).  if( rc==SQ
1b510 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65  LITE_OK ) sqlite
1b520 33 43 6f 64 65 63 51 75 65 72 79 50 61 72 61 6d  3CodecQueryParam
1b530 65 74 65 72 73 28 64 62 2c 20 30 2c 20 7a 4f 70  eters(db, 0, zOp
1b540 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  en);.#endif.  sq
1b550 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1b560 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1b570 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   0xff;.}.../*.**
1b580 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
1b590 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
1b5a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1b5b0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1b5c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
1b5d0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
1b5e0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
1b5f0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
1b600 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b620 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b630 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1b640 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
1b650 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1b660 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
1b670 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
1b680 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
1b690 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
1b6a0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
1b6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1b6c0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
1b6d0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1b6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b6f0 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
1b700 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
1b710 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b720 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
1b730 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
1b740 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
1b750 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
1b760 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
1b770 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
1b780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b790 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
1b7a0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1b7b0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
1b7c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
1b7d0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
1b7e0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
1b7f0 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
1b800 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
1b810 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
1b820 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
1b830 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
1b840 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
1b850 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1b860 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  al;.  int rc;..#
1b870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b880 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1b890 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
1b8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1b8b0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1b8c0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
1b8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b8e0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
1b8f0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1b900 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
1b910 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
1b920 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  dif.  if( zFilen
1b930 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61  ame==0 ) zFilena
1b940 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b  me = "\000\000";
1b950 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
1b960 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
1b970 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
1b980 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
1b990 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
1b9a0 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
1b9b0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
1b9c0 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
1b9d0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
1b9e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1b9f0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
1ba00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
1ba10 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
1ba20 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1ba50 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1ba60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
1ba70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
1ba80 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
1ba90 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
1baa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bab0 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
1bac0 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
1bad0 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
1bae0 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e  .      SCHEMA_EN
1baf0 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a  C(*ppDb) = ENC(*
1bb00 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
1bb10 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
1bb20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1bb30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1bb40 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
1bb50 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
1bb60 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
1bb70 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
1bb80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1bb90 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
1bba0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1bbb0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1bbc0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1bbd0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1bbe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1bbf0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1bc00 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1bc10 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1bc20 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1bc30 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1bc40 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1bc50 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1bc60 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1bc70 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
1bc80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
1bc90 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1bca0 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
1bcb0 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1bcc0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
1bcd0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
1bce0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1bcf0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1bd00 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
1bd10 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
1bd20 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1bd30 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1bd40 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1bd50 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1bd60 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1bd70 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1bd80 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1bd90 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1bda0 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
1bdb0 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
1bdc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
1bdd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bde0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1bdf0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1be00 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1be10 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
1be20 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1be30 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1be40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1be50 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1be60 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
1be70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1be80 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
1be90 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
1bea0 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
1beb0 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
1bec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1bed0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1bee0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1bef0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1bf00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bf20 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1bf30 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1bf40 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bf50 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1bf60 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1bf70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1bf80 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
1bf90 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
1bfa0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1bfb0 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
1bfc0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1bfd0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1bfe0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1bff0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1c000 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
1c010 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c020 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
1c030 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
1c040 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1c050 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1c060 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1c070 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
1c080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1c090 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1c0a0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1c0b0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1c0c0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
1c0d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c0e0 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
1c0f0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
1c100 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
1c110 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1c120 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
1c130 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
1c140 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
1c150 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
1c160 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1c170 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1c180 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1c190 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
1c1a0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1c1b0 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1c1c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c1d0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1c1e0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1c1f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1c200 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
1c210 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
1c220 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1c230 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
1c240 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
1c250 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
1c260 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
1c270 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
1c280 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c290 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
1c2a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
1c2b0 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
1c2c0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
1c2d0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
1c2e0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
1c2f0 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
1c300 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1c310 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
1c320 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1c330 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1c340 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1c350 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1c360 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1c370 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1c380 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1c390 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c3a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1c3b0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
1c3c0 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
1c3d0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1c3e0 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
1c3f0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1c400 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1c410 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c420 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1c430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c440 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c450 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1c460 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1c470 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c480 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1c490 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1c4a0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1c4b0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1c4c0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1c4d0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1c4e0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1c4f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1c500 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
1c510 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
1c520 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
1c530 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
1c540 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
1c550 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
1c560 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
1c570 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
1c580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c590 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c5a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1c5b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1c5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c5d0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1c5e0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1c5f0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1c600 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
1c610 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
1c620 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1c630 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
1c640 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1c650 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1c660 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1c670 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c680 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1c690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1c6a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c6b0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
1c6c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c6d0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1c6e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c6f0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
1c700 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
1c710 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
1c720 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
1c730 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1c740 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
1c750 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
1c760 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
1c770 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
1c780 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
1c790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c7a0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1c7b0 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1c7c0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1c7d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c7e0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
1c7f0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
1c800 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1c810 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
1c820 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
1c830 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
1c840 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
1c850 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
1c860 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
1c870 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
1c880 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
1c890 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
1c8a0 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
1c8b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
1c8c0 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
1c8d0 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
1c8e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1c8f0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1c900 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1c910 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1c920 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1c930 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1c940 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1c950 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
1c960 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
1c970 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1c980 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
1c990 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
1c9a0 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
1c9b0 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
1c9c0 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
1c9d0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
1c9e0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73  TE_NOMEM and pos
1c9f0 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
1ca00 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
1ca10 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
1ca20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
1ca30 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
1ca40 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1ca50 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1ca60 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
1ca70 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
1ca80 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
1ca90 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
1caa0 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
1cab0 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
1cac0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
1cad0 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
1cae0 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
1caf0 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
1cb00 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
1cb10 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
1cb20 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
1cb30 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1cb40 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69  int iErr, int li
1cb50 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  neno, const char
1cb60 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69   *zType){.  sqli
1cb70 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25  te3_log(iErr, "%
1cb80 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  s at line %d of 
1cb90 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
1cba0 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c          zType, l
1cbb0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1cbc0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1cbd0 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a   return iErr;.}.
1cbe0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1cbf0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
1cc00 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1cc10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1cc20 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1cc30 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cc40 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1cc50 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1cc60 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  no, "database co
1cc70 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e  rruption");.}.in
1cc80 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
1cc90 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1cca0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1ccb0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ccc0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1ccd0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1cce0 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1ccf0 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20  MISUSE, lineno, 
1cd00 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74  "misuse");.}.int
1cd10 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
1cd20 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1cd30 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1cd40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1cd50 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1cd60 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1cd70 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1cd80 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e  _CANTOPEN, linen
1cd90 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  o, "cannot open 
1cda0 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66  file");.}.#ifdef
1cdb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
1cdc0 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
1cdd0 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69  PgnoError(int li
1cde0 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  neno, Pgno pgno)
1cdf0 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30  {.  char zMsg[10
1ce00 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
1ce10 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d  printf(sizeof(zM
1ce20 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61  sg), zMsg, "data
1ce30 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1ce40 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b  page %d", pgno);
1ce50 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ce60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ce70 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ce80 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1ce90 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1cea0 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20  ORRUPT, lineno, 
1ceb0 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  zMsg);.}.int sql
1cec0 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69  ite3NomemError(i
1ced0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1cee0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1cef0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1cf00 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1cf10 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1cf20 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  or(SQLITE_NOMEM,
1cf30 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b   lineno, "OOM");
1cf40 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f  .}.int sqlite3Io
1cf50 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  errnomemError(in
1cf60 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1cf70 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1cf80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1cf90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1cfa0 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1cfb0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  r(SQLITE_IOERR_N
1cfc0 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49  OMEM, lineno, "I
1cfd0 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a  /O OOM error");.
1cfe0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1cff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1d000 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
1d010 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
1d020 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
1d030 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
1d040 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
1d050 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
1d060 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
1d070 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
1d080 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
1d090 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
1d0a0 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
1d0b0 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
1d0c0 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
1d0d0 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
1d0e0 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
1d0f0 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
1d100 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
1d110 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1d120 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
1d130 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1d140 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
1d150 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
1d160 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
1d170 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
1d180 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
1d190 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
1d1a0 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
1d1b0 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73  etails..*/.int s
1d1c0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
1d1d0 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
1d1e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d200 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1d210 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1d220 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
1d230 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
1d240 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
1d250 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1d260 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
1d270 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
1d280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1d290 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
1d2a0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
1d2b0 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
1d2c0 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
1d2d0 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
1d2e0 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
1d2f0 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
1d300 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
1d310 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
1d320 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1d330 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d350 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1d360 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
1d370 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
1d380 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
1d390 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1d3a0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1d3b0 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
1d3c0 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
1d3d0 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
1d3e0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1d3f0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1d400 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
1d410 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1d420 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
1d430 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
1d440 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
1d450 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
1d460 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61   iCol = 0;.  cha
1d470 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
1d480 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
1d490 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
1d4a0 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
1d4b0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
1d4c0 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
1d4d0 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
1d4e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d4f0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1d500 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1d510 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1d520 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d   || zTableName==
1d530 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1d540 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1d550 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
1d560 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1d570 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1d580 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
1d590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1d5a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1d5b0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
1d5c0 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
1d5d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
1d5e0 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
1d5f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1d600 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
1d610 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1d620 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
1d630 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
1d640 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
1d650 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1d660 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
1d670 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1d680 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
1d690 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1d6a0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
1d6b0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1d6c0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
1d6d0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
1d6e0 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
1d6f0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f  ted */.  if( zCo
1d700 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  lumnName==0 ){. 
1d710 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
1d720 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62  existance of tab
1d730 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c  le only */.  }el
1d740 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
1d750 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
1d760 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
1d770 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
1d780 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
1d790 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1d7a0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
1d7b0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
1d7c0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
1d7d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1d7e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
1d7f0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
1d800 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
1d810 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  id(pTab) && sqli
1d820 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
1d830 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1d840 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
1d850 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  iPKey;.        p
1d860 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  Col = iCol>=0 ? 
1d870 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1d880 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  ] : 0;.      }el
1d890 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
1d8a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1d8b0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1d8c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d8d0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1d8e0 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
1d8f0 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
1d900 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
1d910 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
1d920 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
1d930 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
1d940 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
1d950 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
1d960 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
1d970 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
1d980 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1d990 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
1d9a0 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
1d9b0 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
1d9c0 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
1d9d0 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
1d9e0 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
1d9f0 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
1da00 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
1da10 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1da20 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
1da30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
1da40 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
1da50 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
1da60 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
1da70 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
1da80 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
1da90 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
1daa0 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
1dab0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1dac0 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
1dad0 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
1dae0 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74  DataType = sqlit
1daf0 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
1db00 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  l,0);.    zCollS
1db10 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
1db20 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
1db30 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
1db40 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
1db50 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
1db60 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
1db70 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
1db80 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
1db90 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
1dba0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1dbb0 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
1dbc0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
1dbd0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
1dbe0 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
1dbf0 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
1dc00 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
1dc10 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
1dc20 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  q = sqlite3StrBI
1dc30 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  NARY;.  }..error
1dc40 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
1dc50 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
1dc60 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
1dc70 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
1dc80 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
1dc90 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
1dca0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
1dcb0 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
1dcc0 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
1dcd0 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
1dce0 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
1dcf0 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
1dd00 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
1dd10 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
1dd20 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
1dd30 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
1dd40 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
1dd50 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
1dd60 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
1dd70 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
1dd80 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
1dd90 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
1dda0 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
1ddb0 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
1ddc0 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
1ddd0 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
1dde0 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
1ddf0 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
1de00 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
1de10 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
1de20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
1de30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1de40 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
1de50 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1de60 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
1de70 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
1de80 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
1de90 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
1dea0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
1deb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1dec0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
1ded0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
1dee0 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
1def0 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
1df00 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1df10 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1df20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1df30 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1df40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1df50 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1df60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1df70 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
1df80 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
1df90 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
1dfa0 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
1dfb0 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
1dfc0 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
1dfd0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1dfe0 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
1dff0 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
1e000 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
1e010 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
1e020 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
1e030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
1e040 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
1e050 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
1e060 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
1e070 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
1e080 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
1e090 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
1e0a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
1e0b0 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
1e0c0 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
1e0d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e0e0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
1e0f0 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
1e100 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
1e110 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
1e120 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
1e130 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
1e140 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
1e150 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1e160 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1e170 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1e180 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1e190 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1e1a0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1e1b0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1e1c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1e1d0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
1e1e0 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
1e1f0 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
1e200 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
1e210 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e220 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1e230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e240 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
1e250 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
1e260 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1e270 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1e280 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
1e290 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
1e2a0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1e2b0 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
1e2c0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
1e2d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e2e0 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
1e2f0 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20  pBtree;..#ifdef 
1e300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1e310 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1e320 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1e330 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1e340 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1e350 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1e360 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1e370 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1e380 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33  pBtree = sqlite3
1e390 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1e3a0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1e3b0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1e3c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1e3d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1e3e0 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *fd;.    sqlite3
1e3f0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1e400 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
1e410 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
1e420 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1e430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1e440 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71  0 );.    fd = sq
1e450 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
1e460 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
1e470 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
1e480 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1e490 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
1e4a0 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1e4b0 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
1e4c0 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63  g = fd;.      rc
1e4d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e4e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1e4f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
1e500 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1e510 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a    *(sqlite3_vfs*
1e520 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1e530 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29  PagerVfs(pPager)
1e540 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1e550 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1e560 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45  e if( op==SQLITE
1e570 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50  _FCNTL_JOURNAL_P
1e580 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1e590 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1e5a0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1e5b0 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61  agerJrnlFile(pPa
1e5c0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1e5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e5e0 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51  }else if( op==SQ
1e5f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f  LITE_FCNTL_DATA_
1e600 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
1e610 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a   *(unsigned int*
1e620 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1e630 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28  agerDataVersion(
1e640 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1e650 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1e680 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
1e690 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20  , pArg);.    }. 
1e6a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1e6b0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1e6c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1e6d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e6e0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1e6f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
1e700 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
1e710 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
1e720 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e730 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
1e740 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1e750 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1e760 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55  UNTESTABLE.  UNU
1e770 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70  SED_PARAMETER(op
1e780 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69  );.#else.  va_li
1e790 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
1e7a0 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
1e7b0 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
1e7c0 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
1e7d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1e7e0 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
1e7f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1e810 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
1e820 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
1e830 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1e840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1e850 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
1e860 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
1e870 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
1e880 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
1e890 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
1e8a0 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
1e8b0 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
1e8c0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
1e8d0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
1e8e0 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
1e8f0 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
1e900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1e910 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1e920 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
1e930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1e940 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
1e950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e960 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1e970 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e980 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1e990 52 4c 5f 50 52 4e 47 5f 53 45 45 44 2c 20 69 6e  RL_PRNG_SEED, in
1e9a0 74 20 78 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t x, sqlite3 *db
1e9b0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1e9c0 20 43 6f 6e 74 72 6f 6c 20 74 68 65 20 73 65 65   Control the see
1e9d0 64 20 66 6f 72 20 74 68 65 20 70 73 65 75 64 6f  d for the pseudo
1e9e0 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67  -random number g
1e9f0 65 6e 65 72 61 74 6f 72 20 28 50 52 4e 47 29 20  enerator (PRNG) 
1ea00 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 62  that.    ** is b
1ea10 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65  uilt into SQLite
1ea20 2e 20 20 43 61 73 65 73 3a 0a 20 20 20 20 2a 2a  .  Cases:.    **
1ea30 0a 20 20 20 20 2a 2a 20 20 20 20 78 21 3d 30 20  .    **    x!=0 
1ea40 26 26 20 64 62 21 3d 30 20 20 20 20 20 20 20 53  && db!=0       S
1ea50 65 65 64 20 74 68 65 20 50 52 4e 47 20 74 6f 20  eed the PRNG to 
1ea60 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1ea70 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  e of the.    ** 
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 63 6f         schema co
1eaa0 6f 6b 69 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  okie in the main
1eab0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 64 62   database for db
1eac0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  , or.    **     
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 78 20 69 66 20 74 68 65 20 73 63 68 65     x if the sche
1eaf0 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 7a 65 72  ma cookie is zer
1eb00 6f 2e 20 20 54 68 69 73 20 63 61 73 65 0a 20 20  o.  This case.  
1eb10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63              is c
1eb30 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65  onvenient to use
1eb40 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
1eb50 75 7a 7a 65 72 73 0a 20 20 20 20 2a 2a 20 20 20  uzzers.    **   
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 61 73 20 69 74 20 61 6c 6c 6f 77       as it allow
1eb80 73 20 74 68 65 20 66 75 7a 7a 65 72 20 73 6f 6d  s the fuzzer som
1eb90 65 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 20 74  e control over t
1eba0 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  he.    **       
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 74 68 65 20 50 52 4e 47 20 73 65 65 64 2e 0a   the PRNG seed..
1ebd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ebe0 20 78 21 3d 30 20 26 26 20 64 62 3d 3d 30 20 20   x!=0 && db==0  
1ebf0 20 20 20 20 20 53 65 65 64 20 74 68 65 20 50 52       Seed the PR
1ec00 4e 47 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  NG to the value 
1ec10 6f 66 20 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  of x..    **.   
1ec20 20 2a 2a 20 20 20 20 78 3d 3d 30 20 26 26 20 64   **    x==0 && d
1ec30 62 3d 3d 30 20 20 20 20 20 20 20 52 65 76 65 72  b==0       Rever
1ec40 74 20 74 6f 20 64 65 66 61 75 6c 74 20 62 65 68  t to default beh
1ec50 61 76 69 6f 72 20 6f 66 20 75 73 69 6e 67 20 74  avior of using t
1ec60 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  he.    **       
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
1ec90 68 6f 64 20 6f 6e 20 74 68 65 20 70 72 69 6d 61  hod on the prima
1eca0 72 79 20 56 46 53 2e 0a 20 20 20 20 2a 2a 0a 20  ry VFS..    **. 
1ecb0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 2d     ** This test-
1ecc0 63 6f 6e 74 72 6f 6c 20 61 6c 73 6f 20 72 65 73  control also res
1ecd0 65 74 73 20 74 68 65 20 50 52 4e 47 20 73 6f 20  ets the PRNG so 
1ece0 74 68 61 74 20 74 68 65 20 6e 65 77 20 73 65 65  that the new see
1ecf0 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  d will.    ** be
1ed00 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 65   used for the ne
1ed10 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  xt call to sqlit
1ed20 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 2e  e3_randomness().
1ed30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ed40 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ed50 5f 50 52 4e 47 5f 53 45 45 44 3a 20 7b 0a 20 20  _PRNG_SEED: {.  
1ed60 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1ed70 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1ed80 20 20 20 69 6e 74 20 79 3b 0a 20 20 20 20 20 20     int y;.      
1ed90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1eda0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1edb0 2a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *);.      assert
1edc0 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  ( db==0 || db->a
1edd0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 21 3d 30  Db[0].pSchema!=0
1ede0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62   );.      if( db
1edf0 20 26 26 20 28 79 20 3d 20 64 62 2d 3e 61 44 62   && (y = db->aDb
1ee00 5b 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  [0].pSchema->sch
1ee10 65 6d 61 5f 63 6f 6f 6b 69 65 29 21 3d 30 20 29  ema_cookie)!=0 )
1ee20 7b 20 78 20 3d 20 79 3b 20 7d 0a 20 20 20 20 20  { x = y; }.     
1ee30 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69   sqlite3Config.i
1ee40 50 72 6e 67 53 65 65 64 20 3d 20 78 3b 0a 20 20  PrngSeed = x;.  
1ee50 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1ee60 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20  omness(0,0);.   
1ee70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ee80 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1ee90 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1eea0 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
1eeb0 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
1eec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1eed0 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
1eee0 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
1eef0 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
1ef00 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
1ef10 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
1ef20 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1ef30 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1ef40 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
1ef50 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
1ef60 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1ef70 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
1ef80 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
1ef90 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
1efa0 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
1efb0 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1efc0 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
1efd0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1efe0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1eff0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f000 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
1f010 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
1f020 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1f030 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
1f040 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
1f050 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
1f060 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1f070 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
1f080 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
1f090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1f0a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1f0b0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f0c0 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20  (FAULT_INSTALL, 
1f0d0 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a  xCallback).    *
1f0e0 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65  *.    ** Arrange
1f0f0 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c   to invoke xCall
1f100 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20  back() whenever 
1f110 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1f120 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
1f130 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b   ** if xCallback
1f140 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
1f150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61    **.    ** As a
1f160 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75   test of the fau
1f170 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63  lt simulator mec
1f180 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73  hanism itself, s
1f190 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1f1a0 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ).    ** is call
1f1b0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1f1c0 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20  fter installing 
1f1d0 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b  the new callback
1f1e0 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a   and the return.
1f1f0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f      ** value fro
1f200 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  m sqlite3FaultSi
1f210 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65  m(0) becomes the
1f220 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20   return from.   
1f230 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
1f240 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20  _control()..    
1f250 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f260 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1f270 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20  T_INSTALL: {.   
1f280 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
1f290 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
1f2a0 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
1f2b0 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
1f2c0 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
1f2d0 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
1f2e0 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
1f2f0 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
1f300 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1f310 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1f320 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a  , int(*)(int));.
1f330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
1f340 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54  ypedef int(*TEST
1f350 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28  CALLBACKFUNC_t)(
1f360 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1f370 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f380 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1f390 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43  va_arg(ap, TESTC
1f3a0 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a  ALLBACKFUNC_t);.
1f3b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f3c0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20  e3FaultSim(0);. 
1f3d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f3e0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1f3f0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1f400 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
1f410 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
1f420 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
1f430 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
1f440 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
1f450 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
1f460 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1f470 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
1f480 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
1f490 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1f4a0 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
1f4b0 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
1f4c0 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1f4d0 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
1f4e0 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
1f4f0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1f500 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
1f510 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1f520 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
1f530 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
1f540 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1f550 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1f560 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
1f570 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1f580 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
1f590 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
1f5a0 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
1f5b0 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
1f5c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f5d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1f5e0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1f5f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1f600 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1f610 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
1f620 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
1f630 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
1f640 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
1f650 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
1f660 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
1f670 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
1f680 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
1f690 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
1f6a0 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
1f6b0 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
1f6c0 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
1f6d0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1f6e0 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
1f6f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
1f700 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
1f710 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1f720 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
1f730 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
1f740 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
1f750 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
1f760 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
1f770 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1f780 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
1f790 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
1f7a0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
1f7b0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
1f7c0 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
1f7d0 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65  * deleterious be
1f7e0 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
1f7f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1f800 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1f810 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
1f820 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
1f830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f840 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
1f850 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1f860 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
1f870 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
1f880 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
1f890 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
1f8a0 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
1f8b0 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
1f8c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1f8d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f8e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1f8f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f900 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f910 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
1f920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f930 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1f940 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1f950 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1f960 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
1f970 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
1f980 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1f990 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
1f9a0 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
1f9b0 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
1f9c0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1f9d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
1f9e0 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
1f9f0 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
1fa00 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1fa10 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1fa20 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1fa30 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
1fa40 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
1fa50 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
1fa60 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
1fa70 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
1fa80 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
1fa90 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
1faa0 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
1fab0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1fac0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1fad0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1fae0 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
1faf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1fb00 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
1fb10 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
1fb20 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
1fb30 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65    assert( /*side
1fb40 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78  -effects-ok*/ (x
1fb50 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1fb60 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
1fb70 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
1fb80 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1fb90 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1fba0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fbb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fbc0 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
1fbd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1fbe0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1fbf0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1fc00 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
1fc10 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
1fc20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
1fc30 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
1fc40 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
1fc50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1fc60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1fc70 41 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69  ALWAYS(X) if X i
1fc80 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20  s true, or 0 if 
1fc90 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  X is false..    
1fca0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1fcb0 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69  commended test i
1fcc0 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20  s X==2.  If the 
1fcd0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1fce0 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  2, that means.  
1fcf0 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e    ** ALWAYS() an
1fd00 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f  d NEVER() are bo
1fd10 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  th no-op pass-th
1fd20 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68  rough macros, wh
1fd30 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ich is the.    *
1fd40 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * default settin
1fd50 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  g.  If the retur
1fd60 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68  n value is 1, th
1fd70 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65  en ALWAYS() is e
1fd80 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72  ither.    ** har
1fd90 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20  d-coded to true 
1fda0 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72  or else it asser
1fdb0 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65  ts if its argume
1fdc0 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20  nt is false..   
1fdd0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65   ** The first be
1fde0 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64  havior (hard-cod
1fdf0 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74  ed to true) is t
1fe00 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1fe10 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1fe20 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1fe30 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1fe40 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65  disabled and the
1fe50 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62   second.    ** b
1fe60 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20  ehavior (assert 
1fe70 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1fe80 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66  to ALWAYS() is f
1fe90 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73  alse) is the cas
1fea0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1feb0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1fec0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1fed0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1fee0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1fef0 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65   The run-time te
1ff00 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67  st procedure mig
1ff10 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e  ht look somethin
1ff20 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  g like this:.   
1ff30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66   **.    **    if
1ff40 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1ff50 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ff60 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32  STCTRL_ALWAYS, 2
1ff70 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20  )==2 ){.    **  
1ff80 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20      // ALWAYS() 
1ff90 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1ffa0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1ffb0 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a  gh macros.    **
1ffc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1ffd0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ffe0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1fff0 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b  RL_ASSERT, 1) ){
20000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
20010 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74  ALWAYS(x) assert
20020 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65  s that x is true
20030 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72  . NEVER(x) asser
20040 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20  ts x is false.. 
20050 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a     **    }else{.
20060 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
20070 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f  LWAYS(x) is a co
20080 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52  nstant 1.  NEVER
20090 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
200a0 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  t 0..    **    }
200b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
200c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
200d0 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20  _ALWAYS: {.     
200e0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
200f0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ap,int);.      r
20100 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78  c = x ? ALWAYS(x
20110 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ) : 0;.      bre
20120 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20130 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74  *.    **   sqlit
20140 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
20150 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20160 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20  BYTEORDER);.    
20170 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  **.    ** The in
20180 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72  teger returned r
20190 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d  eveals the byte-
201a0 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d  order of the com
201b0 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20  puter on which. 
201c0 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20     ** SQLite is 
201d0 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  running:.    **.
201e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20      **       1  
201f0 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
20200 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
20210 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
20220 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74       10     litt
20230 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
20240 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
20250 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31  e.    **  432101
20260 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
20270 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
20280 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
20290 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20     **  123410   
202a0 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
202b0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
202c0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
202d0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */ .    case SQL
202e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
202f0 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20  EORDER: {.      
20300 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45  rc = SQLITE_BYTE
20310 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49  ORDER*100 + SQLI
20320 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a  TE_LITTLEENDIAN*
20330 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45  10 + SQLITE_BIGE
20340 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65  NDIAN;.      bre
20350 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20360 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
20370 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20380 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
20390 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
203a0 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
203b0 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
203c0 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
203d0 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
203e0 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
203f0 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
20400 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
20410 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20420 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
20430 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
20440 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
20450 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
20460 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
20470 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
20480 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20490 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
204a0 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
204b0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
204c0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
204d0 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
204e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
204f0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20500 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20510 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
20520 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20530 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20540 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
20550 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
20560 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
20570 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
20580 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
20590 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
205a0 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
205b0 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
205c0 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
205d0 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
205e0 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
205f0 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
20600 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
20610 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
20620 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
20630 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
20640 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
20650 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
20660 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
20670 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
20680 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
20690 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
206a0 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
206b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
206c0 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
206d0 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
206e0 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
206f0 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
20700 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
20710 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20720 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
20730 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
20740 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
20750 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
20760 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62  *);.      db->db
20770 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29  OptFlags = (u16)
20780 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29  (va_arg(ap, int)
20790 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20   & 0xffff);.    
207a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
207b0 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
207c0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
207d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
207e0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69  CALTIME_FAULT, i
207f0 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
20800 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
20810 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
20820 6f 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65 71 75  on-zero, subsequ
20830 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
20840 61 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20  altime().    ** 
20850 61 6e 64 20 69 74 73 20 76 61 72 69 61 6e 74 73  and its variants
20860 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20   fail. If onoff 
20870 69 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68  is zero, undo th
20880 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
20890 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
208a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
208b0 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
208c0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
208d0 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
208e0 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
208f0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
20900 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20910 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20920 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20930 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e  LITE_TESTCTRL_IN
20940 54 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e  TERNAL_FUNCS, in
20950 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
20960 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
20970 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
20980 6e 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c  n-zero, internal
20990 2d 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75  -use-only SQL fu
209a0 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61  nctions.    ** a
209b0 72 65 20 76 69 73 69 62 6c 65 20 74 6f 20 6f 72  re visible to or
209c0 64 69 6e 61 72 79 20 53 51 4c 2e 20 20 54 68 69  dinary SQL.  Thi
209d0 73 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  s is useful for 
209e0 74 65 73 74 69 6e 67 20 62 75 74 20 69 73 0a 20  testing but is. 
209f0 20 20 20 2a 2a 20 75 6e 73 61 66 65 20 62 65 63     ** unsafe bec
20a00 61 75 73 65 20 69 6e 76 61 6c 69 64 20 70 61 72  ause invalid par
20a10 61 6d 65 74 65 72 73 20 74 6f 20 74 68 6f 73 65  ameters to those
20a20 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e   internal-use-on
20a30 6c 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  ly functions.   
20a40 20 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20 69   ** can result i
20a50 6e 20 63 72 61 73 68 65 73 20 6f 72 20 73 65 67  n crashes or seg
20a60 66 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  faults..    */. 
20a70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20a80 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c  ESTCTRL_INTERNAL
20a90 5f 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20  _FUNCTIONS: {.  
20aa0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20ab0 6c 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61  lConfig.bInterna
20ac0 6c 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f  lFunctions = va_
20ad0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
20ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20af0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
20b00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
20b10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20b20 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69  NEVER_CORRUPT, i
20b30 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
20b40 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
20b50 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
20b60 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64  cates that the d
20b70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
20b80 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20  always well-.   
20b90 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e   ** formed and n
20ba0 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54  ever corrupt.  T
20bb0 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61  his flag is clea
20bc0 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e  r by default, in
20bd0 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20  dicating that.  
20be0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
20bf0 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61  les might have a
20c00 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74  rbitrary corrupt
20c10 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ion.  Setting th
20c20 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20  e flag during.  
20c30 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75    ** testing cau
20c40 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65  ses certain asse
20c50 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
20c60 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62  in the code to b
20c70 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20  e activated.    
20c80 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72  ** that demonstr
20c90 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e  at invariants on
20ca0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
20cb0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20  abase files..   
20cc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20cd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
20ce0 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20  ER_CORRUPT: {.  
20cf0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20d00 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72  lConfig.neverCor
20d10 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rupt = va_arg(ap
20d20 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
20d30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
20d40 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
20d50 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
20d60 5f 54 45 53 54 43 54 52 4c 5f 45 58 54 52 41 5f  _TESTCTRL_EXTRA_
20d70 53 43 48 45 4d 41 5f 43 48 45 43 4b 53 2c 20 69  SCHEMA_CHECKS, i
20d80 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
20d90 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
20da0 61 20 66 6c 61 67 20 74 68 61 74 20 63 61 75 73  a flag that caus
20db0 65 73 20 53 51 4c 69 74 65 20 74 6f 20 76 65 72  es SQLite to ver
20dc0 69 66 79 20 74 68 61 74 20 74 79 70 65 2c 20 6e  ify that type, n
20dd0 61 6d 65 2c 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ame,.    ** and 
20de0 74 62 6c 5f 6e 61 6d 65 20 66 69 65 6c 64 73 20  tbl_name fields 
20df0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
20e00 73 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68 69  ster table.  Thi
20e10 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  s is normally.  
20e20 20 20 2a 2a 20 6f 6e 2c 20 62 75 74 20 69 74 20    ** on, but it 
20e30 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  is sometimes use
20e40 66 75 6c 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ful to turn it o
20e50 66 66 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a  ff for testing..
20e60 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20e70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20e80 45 58 54 52 41 5f 53 43 48 45 4d 41 5f 43 48 45  EXTRA_SCHEMA_CHE
20e90 43 4b 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  CKS: {.      sql
20ea0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
20eb0 2e 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65  .bExtraSchemaChe
20ec0 63 6b 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  cks = va_arg(ap,
20ed0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
20ee0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20ef0 2a 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68  * Set the thresh
20f00 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f  old at which OP_
20f10 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65  Once counters re
20f20 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f  set back to zero
20f30 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61  ..    ** By defa
20f40 75 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66  ult this is 0x7f
20f50 66 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62  fffffe (over 2 b
20f60 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61  illion), but tha
20f70 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a  t value is.    *
20f80 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73  * too big to tes
20f90 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c  t in a reasonabl
20fa0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
20fb0 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f  , so this contro
20fc0 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76  l is.    ** prov
20fd0 69 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d  ided to set a sm
20fe0 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72  all and easily r
20ff0 65 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76  eachable reset v
21000 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
21010 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
21020 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54  TCTRL_ONCE_RESET
21030 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20  _THRESHOLD: {.  
21040 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21050 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73  lConfig.iOnceRes
21060 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61  etThreshold = va
21070 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
21080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21090 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
210a0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
210b0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
210c0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
210d0 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
210e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
210f0 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
21100 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
21110 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
21120 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
21130 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
21140 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
21150 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
21160 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
21170 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
21180 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
21190 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
211a0 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
211b0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75  allback)(void*,u
211c0 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20  nsigned int,.   
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
21200 2c 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b  ,unsigned char);
21210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
21220 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
21230 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
21240 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
21250 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
21260 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21270 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
21280 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
21290 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
212a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
212b0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
212c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
212d0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
212e0 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
212f0 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
21300 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
21310 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
21320 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
21330 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
21340 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
21350 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
21360 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
21370 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
21380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
21390 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
213a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
213b0 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
213c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
213d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
213e0 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
213f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
21400 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
21410 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
21420 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
21430 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
21440 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
21450 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21460 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
21470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
21480 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
21490 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
214a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
214b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
214c0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
214d0 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
214e0 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
214f0 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
21500 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
21510 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
21520 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
21530 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
21540 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
21550 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21560 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
21570 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
21580 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
21590 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
215a0 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
215b0 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
215c0 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
215d0 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
215e0 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
215f0 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
21600 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
21610 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
21620 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
21630 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
21640 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
21650 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
21660 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
21670 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
21680 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21690 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
216a0 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
216b0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
216c0 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
216d0 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
216e0 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
216f0 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
21700 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
21710 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
21720 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
21730 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
21740 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
21750 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
21760 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
21770 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
21780 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
21790 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
217a0 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
217b0 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
217c0 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
217d0 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
217e0 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
217f0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
21800 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
21810 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
21820 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
21830 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
21840 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
21850 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
21860 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
21870 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
21880 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
21890 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
218a0 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
218b0 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
218c0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
218d0 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
218e0 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
218f0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
21900 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
21910 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
21920 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
21930 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
21940 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
21950 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
21960 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
21970 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
21980 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
21990 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
219a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
219b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
219c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
219d0 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
219e0 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  GE).    /*  sqli
219f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
21a00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
21a10 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
21a20 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20  , FILE *out).   
21a30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
21a40 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e  test control (on
21a50 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65  ly available whe
21a60 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  n SQLite is comp
21a70 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  iled with.    **
21a80 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77   -DYYCOVERAGE) w
21a90 72 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f  rites a report o
21aa0 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73  nto "out" that s
21ab0 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  hows all.    ** 
21ac0 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20  state/lookahead 
21ad0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20  combinations in 
21ae0 74 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65  the parser state
21af0 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20   machine.    ** 
21b00 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
21b10 65 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61  exercised.  If a
21b20 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73  ny state is miss
21b30 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  ed, make the.   
21b40 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20   ** return code 
21b50 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
21b60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
21b70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
21b80 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b  RSER_COVERAGE: {
21b90 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
21ba0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49   = va_arg(ap, FI
21bb0 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE*);.      if( 
21bc0 73 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76  sqlite3ParserCov
21bd0 65 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20  erage(out) ) rc 
21be0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
21bf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21c00 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
21c10 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
21c20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c   */..    /*  sql
21c30 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
21c40 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
21c50 4c 5f 52 45 53 55 4c 54 5f 49 4e 54 52 45 41 4c  L_RESULT_INTREAL
21c60 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
21c70 74 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t*);.    **.    
21c80 2a 2a 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e  ** This test-con
21c90 74 72 6f 6c 20 63 61 75 73 65 73 20 74 68 65 20  trol causes the 
21ca0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
21cb0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
21cc0 28 29 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  () value.    ** 
21cd0 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
21ce0 64 20 61 73 20 61 20 4d 45 4d 5f 49 6e 74 52 65  d as a MEM_IntRe
21cf0 61 6c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73  al instead of as
21d00 20 61 6e 20 4d 45 4d 5f 49 6e 74 2e 20 20 4e 6f   an MEM_Int.  No
21d10 72 6d 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 4d  rmally,.    ** M
21d20 45 4d 5f 49 6e 74 52 65 61 6c 20 76 61 6c 75 65  EM_IntReal value
21d30 73 20 6f 6e 6c 79 20 61 72 69 73 65 20 64 75 72  s only arise dur
21d40 69 6e 67 20 61 6e 20 49 4e 53 45 52 54 20 6f 70  ing an INSERT op
21d50 65 72 61 74 69 6f 6e 20 6f 66 20 69 6e 74 65 67  eration of integ
21d60 65 72 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  er.    ** values
21d70 20 69 6e 74 6f 20 61 20 52 45 41 4c 20 63 6f 6c   into a REAL col
21d80 75 6d 6e 2c 20 73 6f 20 74 68 65 79 20 63 61 6e  umn, so they can
21d90 20 62 65 20 63 68 61 6c 6c 65 6e 67 69 6e 67 20   be challenging 
21da0 74 6f 20 74 65 73 74 2e 20 20 54 68 69 73 0a 20  to test.  This. 
21db0 20 20 20 2a 2a 20 74 65 73 74 2d 63 6f 6e 74 72     ** test-contr
21dc0 6f 6c 20 65 6e 61 62 6c 65 73 20 75 73 20 74 6f  ol enables us to
21dd0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 72 65 61   write an intrea
21de0 6c 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  l() SQL function
21df0 20 74 68 61 74 20 63 61 6e 0a 20 20 20 20 2a 2a   that can.    **
21e00 20 69 6e 6a 65 63 74 20 61 6e 20 69 6e 74 72 65   inject an intre
21e10 61 6c 28 29 20 76 61 6c 75 65 20 61 74 20 61 72  al() value at ar
21e20 62 69 74 72 61 72 79 20 70 6c 61 63 65 73 20 69  bitrary places i
21e30 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
21e40 6e 74 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  nt,.    ** for t
21e50 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
21e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21e70 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21e80 5f 52 45 53 55 4c 54 5f 49 4e 54 52 45 41 4c 3a  _RESULT_INTREAL:
21e90 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
21ea0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  _context *pCtx =
21eb0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
21ec0 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20  te3_context*);. 
21ed0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75       sqlite3Resu
21ee0 6c 74 49 6e 74 52 65 61 6c 28 70 43 74 78 29 3b  ltIntReal(pCtx);
21ef0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21f00 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
21f10 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
21f20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c  SQLITE_UNTESTABL
21f30 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  E */.  return rc
21f40 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
21f50 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
21f60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 70 70 65  his routine appe
21f70 61 72 73 20 69 6e 73 69 64 65 20 61 73 73 65 72  ars inside asser
21f80 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
21f90 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  nly..**.** Retur
21fa0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21fb0 55 52 49 20 70 61 72 61 6d 65 74 65 72 73 20 74  URI parameters t
21fc0 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66  hat follow the f
21fd0 69 6c 65 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  ilename..*/.int 
21fe0 73 71 6c 69 74 65 33 55 72 69 43 6f 75 6e 74 28  sqlite3UriCount(
21ff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
22000 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
22010 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
22020 20 30 3b 0a 20 20 7a 20 2b 3d 20 73 74 72 6c 65   0;.  z += strle
22030 6e 28 7a 29 2b 31 3b 0a 20 20 77 68 69 6c 65 28  n(z)+1;.  while(
22040 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 20 2b   z[0] ){.    z +
22050 3d 20 73 74 72 6c 65 6e 28 7a 29 2b 31 3b 0a 20  = strlen(z)+1;. 
22060 20 20 20 7a 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     z += strlen(z
22070 29 2b 31 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  )+1;.    n++;.  
22080 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
22090 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
220a0 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
220b0 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
220c0 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
220d0 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
220e0 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
220f0 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
22100 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
22110 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
22120 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
22130 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
22140 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
22150 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
22160 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
22170 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
22180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
22190 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
221a0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
221b0 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
221c0 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
221d0 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
221e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
221f0 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
22200 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
22210 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
22220 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
22230 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
22240 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
22250 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
22260 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
22270 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
22280 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
22290 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
222a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
222b0 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
222c0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
222d0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
222e0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
222f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
22300 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
22310 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
22320 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
22330 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72  Param==0 ) retur
22340 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  n 0;.  zFilename
22350 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
22360 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
22370 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69   1;.  while( zFi
22380 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
22390 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28   int x = strcmp(
223a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
223b0 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  m);.    zFilenam
223c0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
223d0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
223e0 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d  + 1;.    if( x==
223f0 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  0 ) return zFile
22400 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  name;.    zFilen
22410 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
22420 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
22430 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  ) + 1;.  }.  ret
22440 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22450 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e  Return a boolean
22460 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
22470 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
22480 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69  .int sqlite3_uri
22490 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
224a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
224b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
224c0 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a  am, int bDflt){.
224d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
224e0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
224f0 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
22500 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44  e, zParam);.  bD
22510 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a  flt = bDflt!=0;.
22520 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c    return z ? sql
22530 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
22540 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74  , bDflt) : bDflt
22550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22560 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  n a 64-bit integ
22570 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  er value for a q
22580 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
22590 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
225a0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74   sqlite3_uri_int
225b0 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  64(.  const char
225c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
225d0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70  /* Filename as p
225e0 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a  assed to xOpen *
225f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22600 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a  zParam,       /*
22610 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73   URI parameter s
22620 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ought */.  sqlit
22630 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20  e3_int64 bDflt  
22640 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69       /* return i
22650 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d  f parameter is m
22660 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  issing */.){.  c
22670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
22680 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
22690 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
226a0 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74  zParam);.  sqlit
226b0 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66  e3_int64 v;.  if
226c0 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65  ( z && sqlite3De
226d0 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
226e0 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44 66  v)==0 ){.    bDf
226f0 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
22700 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
22710 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22720 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
22730 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
22740 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
22750 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
22760 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
22770 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
22780 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
22790 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
227a0 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44  {.  int iDb = zD
227b0 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46  bName ? sqlite3F
227c0 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
227d0 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65  bName) : 0;.  re
227e0 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a  turn iDb<0 ? 0 :
227f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
22800 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
22810 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
22820 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22830 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22840 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
22850 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
22860 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
22870 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
22880 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
22890 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
228a0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
228b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
228c0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
228d0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
228e0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
228f0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
22900 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22910 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22920 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
22930 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
22940 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
22950 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
22960 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
22970 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
22980 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
22990 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
229a0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
229b0 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
229c0 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
229d0 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
229e0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
229f0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
22a00 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
22a10 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
22a20 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
22a30 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
22a40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
22a50 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
22a60 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
22a70 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
22a80 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
22a90 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
22aa0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
22ab0 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
22ac0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
22ad0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
22ae0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
22af0 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
22b00 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
22b10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
22b20 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f  NABLE_SNAPSHOT./
22b30 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e  *.** Obtain a sn
22b40 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f  apshot handle fo
22b50 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  r the snapshot o
22b60 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 63  f database zDb c
22b70 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69  urrently .** bei
22b80 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c  ng read by handl
22b90 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
22ba0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
22bb0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
22bc0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
22bd0 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *zDb,.  sqlite3_
22be0 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61  snapshot **ppSna
22bf0 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
22c00 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
22c10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22c20 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
22c30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22c40 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
22c50 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
22c60 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
22c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
22c80 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
22c90 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
22ca0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
22cb0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28 20  >mutex);..  if( 
22cc0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
22cd0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  0 ){.    int iDb
22ce0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
22cf0 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
22d00 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c     if( iDb==0 ||
22d10 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20   iDb>1 ){.      
22d20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
22d30 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
22d40 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
22d50 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
22d60 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
22d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22d80 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
22d90 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
22da0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22dd0 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71  erSnapshotGet(sq
22de0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
22df0 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74  pBt), ppSnapshot
22e00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22e10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22e20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22e30 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
22e40 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
22e50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
22e60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e70 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65  ./*.** Open a re
22e80 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad-transaction o
22e90 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69  n the snapshot i
22ea0 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e  dendified by pSn
22eb0 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  apshot..*/.int s
22ec0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
22ed0 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  open(.  sqlite3 
22ee0 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
22ef0 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69  ar *zDb, .  sqli
22f00 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
22f10 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74  napshot.){.  int
22f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
22f30 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  OR;.#ifndef SQLI
22f40 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66  TE_OMIT_WAL..#if
22f50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22f60 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
22f70 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
22f80 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
22f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22fa0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22fb0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
22fc0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
22fd0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
22fe0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
22ff0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
23000 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
23010 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
23020 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
23030 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
23040 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
23050 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
23060 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
23070 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
23080 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30  sInTrans(pBt)==0
23090 20 29 7b 0a 20 20 20 20 20 20 20 20 50 61 67 65   ){.        Page
230a0 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
230b0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
230c0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t);.        int 
230d0 62 55 6e 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  bUnlock = 0;.   
230e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
230f0 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
23100 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
23110 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64       if( db->nVd
23120 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20  beActive==0 ){. 
23130 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23140 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
23150 73 68 6f 74 43 68 65 63 6b 28 70 50 61 67 65 72  shotCheck(pPager
23160 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  , pSnapshot);.  
23170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
23180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 62 55 6e               bUn
231a0 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  lock = 1;.      
231b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
231c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
231d0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pBt);.          
231e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
231f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
23220 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
23230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23240 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23250 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
23260 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20  hotOpen(pPager, 
23270 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
23280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
232a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
232b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
232c0 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c  ginTrans(pBt, 0,
232d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
232e0 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
232f0 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20  hotOpen(pPager, 
23300 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
23310 20 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 63        if( bUnloc
23320 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  k ){.          s
23330 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
23340 68 6f 74 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  hotUnlock(pPager
23350 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
23370 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23380 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
23390 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
233a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
233b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
233c0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61  ./*.** Recover a
233d0 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74 73  s many snapshots
233e0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
233f0 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 61  m the wal file a
23400 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
23410 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f 66 20  * schema zDb of 
23420 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a  database db..*/.
23430 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  int sqlite3_snap
23440 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73 71 6c  shot_recover(sql
23450 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
23460 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e  char *zDb){.  in
23470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
23480 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ROR;.  int iDb;.
23490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
234a0 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
234b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
234c0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
234d0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
234e0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
234f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
23500 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
23510 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
23520 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
23530 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20 3d 20  mutex);.  iDb = 
23540 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
23550 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66  e(db, zDb);.  if
23560 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
23570 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  1 ){.    Btree *
23580 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  pBt = db->aDb[iD
23590 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  b].pBt;.    if( 
235a0 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
235b0 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
235c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
235d0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
235e0 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30  nTrans(pBt, 0, 0
235f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
23600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23620 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52  e3PagerSnapshotR
23630 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74  ecover(sqlite3Bt
23640 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
23650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23660 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
23670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23680 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
23690 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
236a0 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
236b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
236c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
236d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
236e0 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65   snapshot handle
236f0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
23700 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
23710 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  get()..*/.void s
23720 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
23730 66 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61  free(sqlite3_sna
23740 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
23750 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
23760 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a  e(pSnapshot);.}.
23770 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23780 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
23790 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
237a0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
237b0 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a  OPTION_DIAGS./*.
237c0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
237d0 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74  e of a compile-t
237e0 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75  ime option, retu
237f0 72 6e 20 74 72 75 65 20 69 66 20 74 68 61 74 20  rn true if that 
23800 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73  option.** was us
23810 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  ed and false if 
23820 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  not..**.** The n
23830 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c  ame can optional
23840 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20 22 53  ly begin with "S
23850 51 4c 49 54 45 5f 22 20 62 75 74 20 74 68 65 20  QLITE_" but the 
23860 22 53 51 4c 49 54 45 5f 22 20 70 72 65 66 69 78  "SQLITE_" prefix
23870 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
23880 72 65 64 20 66 6f 72 20 61 20 6d 61 74 63 68 2e  red for a match.
23890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
238a0 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
238b0 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ed(const char *z
238c0 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  OptName){.  int 
238d0 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74  i, n;.  int nOpt
238e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
238f0 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20  *azCompileOpt;. 
23900 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
23910 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
23920 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29  f( zOptName==0 )
23930 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
23940 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
23950 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23960 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f  }.#endif..  azCo
23970 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74  mpileOpt = sqlit
23980 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  e3CompileOptions
23990 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20  (&nOpt);..  if( 
239a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
239b0 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54  zOptName, "SQLIT
239c0 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70  E_", 7)==0 ) zOp
239d0 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20  tName += 7;.  n 
239e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
239f0 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20  0(zOptName);..  
23a00 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74 20 69 73  /* Since nOpt is
23a10 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e   normally in sin
23a20 67 6c 65 20 64 69 67 69 74 73 2c 20 61 20 6c 69  gle digits, a li
23a30 6e 65 61 72 20 73 65 61 72 63 68 20 69 73 20 0a  near search is .
23a40 20 20 2a 2a 20 61 64 65 71 75 61 74 65 2e 20 4e    ** adequate. N
23a50 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 6e  o need for a bin
23a60 61 72 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20  ary search. */. 
23a70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74   for(i=0; i<nOpt
23a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
23a90 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
23aa0 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70  zOptName, azComp
23ab0 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30  ileOpt[i], n)==0
23ac0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
23ad0 49 73 49 64 43 68 61 72 28 28 75 6e 73 69 67 6e  IsIdChar((unsign
23ae0 65 64 20 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c  ed char)azCompil
23af0 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20  eOpt[i][n])==0. 
23b00 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
23b10 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
23b20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
23b30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23b40 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  N-th compile-tim
23b50 65 20 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e  e option string.
23b60 20 20 49 66 20 4e 20 69 73 20 6f 75 74 20 6f 66    If N is out of
23b70 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72   range,.** retur
23b80 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  n a NULL pointer
23b90 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
23ba0 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65  *sqlite3_compile
23bb0 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e  option_get(int N
23bc0 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20  ){.  int nOpt;. 
23bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
23be0 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a  CompileOpt;.  az
23bf0 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c  CompileOpt = sql
23c00 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  ite3CompileOptio
23c10 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28  ns(&nOpt);.  if(
23c20 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20   N>=0 && N<nOpt 
23c30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 7a  ){.    return az
23c40 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20  CompileOpt[N];. 
23c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23c60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23c70 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
23c80 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a        TION_DIAGS */.