/ Hex Artifact Content
Login

Artifact 45866058b9cd1232901b17a76ea81157e87e114facee6686c3bffe696ef35e6a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
63e0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
63f0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
6400: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6410: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
6420: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6430: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6440: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6450: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6460: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6470: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6480: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6490: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
64a0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
64b0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
64c0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
64d0: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
64e0: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
64f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
6500: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
6510: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
6520: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
6530: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
6540: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6550: 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20  e.nSlot = cnt;. 
6560: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
6570: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
6580: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
6590: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
65a0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
65b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
65c0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
65d0: 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b  aside.pInit = p;
65e0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
65f0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
6600: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
6610: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6620: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
6630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
6640: 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  isable = 0;.    
6650: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6660: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
6670: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
6680: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6690: 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a  de.pStart = db;.
66a0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66b0: 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20  e.pEnd = db;.   
66c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66d0: 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  Disable = 1;.   
66e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66f0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
6700: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6710: 6e 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  nSlot = 0;.  }.#
6720: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6730: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a  OMIT_LOOKASIDE *
6740: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
6750: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6760: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
6770: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6780: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
6790: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
67a0: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
67b0: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
67c0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
67d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
67e0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
67f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6800: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
6810: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
6820: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
6830: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
6840: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
6850: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  tex;.}../*.** Fr
6860: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
6870: 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66  mory as we can f
6880: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61  rom the given da
6890: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
68a0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
68b0: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
68c0: 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a  memory(sqlite3 *
68d0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  db){.  int i;..#
68e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
68f0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6900: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6910: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6930: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6940: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6950: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6960: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6970: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6990: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
69a0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
69b0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
69c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
69d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
69e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
69f0: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6a00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
6a10: 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nk(pPager);.    
6a20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6a30: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6a40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6a50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6a60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
6a70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6a80: 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   Flush any dirty
6a90: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
6aa0: 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e  ger-cache for an
6ab0: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
6ac0: 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ase.** to disk..
6ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
6ae0: 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c  b_cacheflush(sql
6af0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6b00: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
6b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
6b20: 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a  bSeenBusy = 0;..
6b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6b40: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6b50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6b60: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6b80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6b90: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6ba0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6bb0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6bc0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
6be0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
6bf0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6c00: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6c10: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
6c20: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6c30: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
6c40: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
6c50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6c60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6c70: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6c90: 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a  rFlush(pPager);.
6ca0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6cb0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6cc0: 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d       bSeenBusy =
6cd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
6ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6d00: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6d10: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6d20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6d30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6d40: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
6d50: 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73  E_OK && bSeenBus
6d60: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
6d70: 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
6d80: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
6d90: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
6da0: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
6db0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
6dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6dd0: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
6de0: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
6df0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
6e00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
6e10: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
6e20: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
6e30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6e40: 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
6e50: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  E: {.      /* IM
6e60: 50 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31  P: R-06824-28531
6e70: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   */.      /* IMP
6e80: 3a 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20  : R-36257-52125 
6e90: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  */.      db->aDb
6ea0: 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76  [0].zDbSName = v
6eb0: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
6ec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6ed0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  TE_OK;.      bre
6ee0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ef0: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
6f00: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
6f10: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
6f20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
6f30: 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  id*); /* IMP: R-
6f40: 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20  26835-10964 */. 
6f50: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
6f60: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6f70: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
6f80: 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20  7871-25994 */.  
6f90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
6fa0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6fb0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34      /* IMP: R-04
6fc0: 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20  460-53386 */.   
6fd0: 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f     rc = setupLoo
6fe0: 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c  kaside(db, pBuf,
6ff0: 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20   sz, cnt);.     
7000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7010: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7020: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7030: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
7040: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a   int op;      /*
7050: 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   The opcode */. 
7060: 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b         u32 mask;
7070: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
7080: 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65  he bit in sqlite
7090: 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63  3.flags to set/c
70a0: 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20  lear */.      } 
70b0: 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aFlagOp[] = {.  
70c0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
70d0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
70e0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53  KEY,           S
70f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
7100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
7110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
7120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
7130: 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
7140: 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d  EnableTrigger  }
7150: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
7160: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
7170: 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
7180: 52 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f  R, SQLITE_Fts3To
7190: 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20  kenizer  },.    
71a0: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
71b0: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
71c0: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c  D_EXTENSION, SQL
71d0: 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
71e0: 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n  },.        { 
71f0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7200: 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
7210: 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f  ,      SQLITE_No
7220: 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a  CkptOnClose  },.
7230: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7240: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
7250: 5f 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20  _QPSG,          
7260: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
7270: 53 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  SG     },.      
7280: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7290: 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20  E_TriggerEQP    
72c0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
72d0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
72e0: 53 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20  SET_DATABASE,   
72f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65       SQLITE_Rese
7300: 74 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20  tDatabase  },.  
7310: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7320: 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
7330: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  E,             S
7340: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20  QLITE_Defensive 
7350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b       },.      };
7360: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
7370: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
7380: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
7390: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
73a0: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
73b0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
73c0: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
73d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
73e0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
73f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
7400: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
7410: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
7420: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
7430: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
7440: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 36  *);.          u6
7450: 34 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  4 oldFlags = db-
7460: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
7470: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
7480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7490: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
74a0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
74b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
74c0: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
74d0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
74e0: 20 26 3d 20 7e 28 75 36 34 29 61 46 6c 61 67 4f   &= ~(u64)aFlagO
74f0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7510: 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64   if( oldFlags!=d
7520: 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  b->flags ){.    
7530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7540: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
7550: 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
7560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7570: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
7580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
7590: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
75a0: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
75b0: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
75c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
75d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
75e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
75f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7610: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
7620: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
7630: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
7640: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
7650: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
7660: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
7670: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
7680: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
7690: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
76a0: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
76b0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
76c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
76d0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
76e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
76f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
7700: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
7710: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
7720: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
7730: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
7740: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
7750: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
7760: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
7770: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
7780: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
7790: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
77a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
77b0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
77c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
77d0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
77e0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
77f0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
7800: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
7810: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
7820: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
7830: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
7840: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
7850: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f  ey1 : nKey2;.  /
7860: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7870: 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65  -65033-28449 The
7880: 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59   built-in BINARY
7890: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61   collation compa
78a0: 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  res.  ** strings
78b0: 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73   byte by byte us
78c0: 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29  ing the memcmp()
78d0: 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74   function from t
78e0: 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20  he standard C.  
78f0: 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20  ** library. */. 
7900: 20 61 73 73 65 72 74 28 20 70 4b 65 79 31 20 26   assert( pKey1 &
7910: 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20  & pKey2 );.  rc 
7920: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
7930: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
7940: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
7950: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
7960: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
7970: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
7980: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
7990: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
79a0: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
79b0: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
79c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
79d0: 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52   R-31624-24737 R
79e0: 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e  TRIM is like BIN
79f0: 41 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20  ARY except that 
7a00: 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73  extra.      ** s
7a10: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
7a20: 20 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e   of either strin
7a30: 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  g do not change 
7a40: 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f  the result. In o
7a50: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f  ther.      ** wo
7a60: 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c  rds, strings wil
7a70: 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  l compare equal 
7a80: 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61  to one another a
7a90: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20  s long as they. 
7aa0: 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f       ** differ o
7ab0: 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  nly in the numbe
7ac0: 72 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74  r of spaces at t
7ad0: 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f  he end..      */
7ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7af0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
7b00: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
7b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7b20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7b30: 65 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20  e if CollSeq is 
7b40: 74 68 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c  the default buil
7b50: 74 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a  t-in BINARY..*/.
7b60: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e  int sqlite3IsBin
7b70: 61 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ary(const CollSe
7b80: 71 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  q *p){.  assert(
7b90: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70   p==0 || p->xCmp
7ba0: 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c 7c  !=binCollFunc ||
7bb0: 20 70 2d 3e 70 55 73 65 72 21 3d 30 0a 20 20 20   p->pUser!=0.   
7bc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
7bd0: 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e  mp(p->zName,"BIN
7be0: 41 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65  ARY")==0 );.  re
7bf0: 74 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 28 70 2d  turn p==0 || (p-
7c00: 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75  >xCmp==binCollFu
7c10: 6e 63 20 26 26 20 70 2d 3e 70 55 73 65 72 3d 3d  nc && p->pUser==
7c20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  0);.}../*.** Ano
7c30: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7c40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7c50: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7c60: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7c70: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7c80: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7c90: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7ca0: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7cb0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7cc0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7cd0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7ce0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7cf0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7d00: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7d10: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7d20: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7d30: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7d40: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7d50: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7d60: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7d70: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7d80: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7d90: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7da0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7db0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7dc0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7dd0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7de0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7df0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7e00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7e10: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7e20: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7e30: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7e40: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7e50: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7e60: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7e70: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7e80: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7e90: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7ea0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7eb0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7ec0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7ed0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7ee0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7ef0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7f00: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7f10: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7f20: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7f30: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7f40: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7f50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7f60: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7f70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7f80: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7f90: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  id;.}../*.** Set
7fa0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7fb0: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ned by the sqlit
7fc0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7fd0: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
7fe0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7ff0: 69 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e  ite3_set_last_in
8000: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
8010: 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f  e3 *db, sqlite3_
8020: 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23  int64 iRowid){.#
8030: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8040: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
8050: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8060: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8070: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
8080: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8090: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
80a0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
80b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
80c0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61  mutex);.  db->la
80d0: 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
80e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
80f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8100: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
8110: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8120: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
8130: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
8140: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
8150: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
8160: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
8170: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
8180: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
8190: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
81a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
81b0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
81c0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
81d0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
81e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
81f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
8200: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
8210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8220: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
8230: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
8240: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
8250: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8260: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
8270: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
8280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8290: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
82a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
82b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
82c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
82d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
82e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
82f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
8300: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
8310: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
8320: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
8330: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
8340: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
8350: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
8360: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8370: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
8380: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
8390: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
83a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
83b0: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
83c0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
83d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
83e0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
83f0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
8400: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
8410: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
8420: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
8430: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
8440: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
8450: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
8460: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8470: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
8480: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
8490: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
84a0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
84b0: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
84c0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
84d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
84e0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
84f0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
8500: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
8510: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
8520: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
8530: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
8540: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
8550: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
8560: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
8570: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
8580: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
8590: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
85a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
85b0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
85c0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
85d0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
85e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
85f0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
8600: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
8610: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
8620: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
8630: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
8640: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
8650: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8660: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8670: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8680: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
8690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
86a0: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
86b0: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
86c0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
86d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
86e0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
86f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8700: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
8710: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
8720: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
8730: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
8740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
8750: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
8760: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
8770: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
8780: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8790: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
87a0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
87b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
87c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
87d0: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
87e0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
87f0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
8800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8810: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
8820: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8830: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
8840: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63  ema;.    if( pSc
8850: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f  hema ){.      fo
8860: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
8870: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
8880: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
8890: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
88a0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
88b0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
88c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
88d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
88e0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
88f0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8900: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
8910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8920: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8930: 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62  IsReuseSchema(db
8940: 29 20 29 7b 0a 20 20 20 20 20 20 56 54 61 62 6c  ) ){.      VTabl
8950: 65 20 2a 70 56 54 61 62 6c 65 3b 0a 20 20 20 20  e *pVTable;.    
8960: 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78 74 3b    VTable *pNext;
8970: 0a 20 20 20 20 20 20 66 6f 72 28 70 56 54 61 62  .      for(pVTab
8980: 6c 65 3d 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 56  le=db->aDb[i].pV
8990: 54 61 62 6c 65 3b 20 70 56 54 61 62 6c 65 3b 20  Table; pVTable; 
89a0: 70 56 54 61 62 6c 65 3d 70 4e 65 78 74 29 7b 0a  pVTable=pNext){.
89b0: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
89c0: 70 56 54 61 62 6c 65 2d 3e 70 4e 65 78 74 3b 0a  pVTable->pNext;.
89d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
89e0: 74 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 6c  tabUnlock(pVTabl
89f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
8a00: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 56 54    db->aDb[i].pVT
8a10: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  able = 0;.    }.
8a20: 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69    }.  for(p=sqli
8a30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8a40: 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d  >aModule); p; p=
8a50: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
8a60: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8a70: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8a80: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8a90: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  p);.    if( pMod
8aa0: 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20  ->pEpoTab ){.   
8ab0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 44 69     sqlite3VtabDi
8ac0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f  sconnect(db, pMo
8ad0: 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20  d->pEpoTab);.   
8ae0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8af0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
8b00: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
8b10: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
8b20: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
8b30: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65  ARAMETER(db);.#e
8b40: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
8b50: 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74  turn TRUE if dat
8b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8b70: 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69   db has unfinali
8b80: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
8b90: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8ba0: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
8bb0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e  _backup objects.
8bc0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
8bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8be0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
8bf0: 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72    int j;.  asser
8c00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8c10: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
8c20: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   );.  if( db->pV
8c30: 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  dbe ) return 1;.
8c40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
8c50: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
8c60: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8c70: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
8c80: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
8c90: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
8ca0: 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e  up(pBt) ) return
8cb0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
8cc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
8cd0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
8ce0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
8cf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8d00: 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65  ite3Close(sqlite
8d10: 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65  3 *db, int force
8d20: 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21  Zombie){.  if( !
8d30: 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  db ){.    /* EVI
8d40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35  DENCE-OF: R-6325
8d50: 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20  7-11740 Calling 
8d60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8d70: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8d80: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74  3_close_v2() wit
8d90: 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  h a NULL pointer
8da0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68   argument is a h
8db0: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a  armless no-op. *
8dc0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
8dd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
8de0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8df0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
8e00: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8e10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8e20: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
8e30: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
8e40: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
8e50: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
8e60: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20  ITE_TRACE_CLOSE 
8e70: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63  ){.    db->xTrac
8e80: 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  e(SQLITE_TRACE_C
8e90: 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65  LOSE, db->pTrace
8ea0: 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d  Arg, db, 0);.  }
8eb0: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8ec0: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8ed0: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8ee0: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
8ef0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
8f00: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
8f10: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
8f20: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
8f30: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
8f40: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8f50: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8f60: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8f70: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8f80: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8f90: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8fa0: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8fb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8fc0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8fd0: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8fe0: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
8ff0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
9000: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
9010: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
9020: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
9030: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
9040: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9050: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
9060: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
9070: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
9080: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
9090: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
90a0: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
90b0: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
90c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
90d0: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
90e0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
90f0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
9100: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
9110: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
9120: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
9130: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
9140: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
9150: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
9160: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
9170: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
9180: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
9190: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
91a0: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
91b0: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
91c0: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
91d0: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
91e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
91f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
9200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
9210: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
9220: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
9230: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
9240: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
9250: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
9260: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
9270: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
9280: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
9290: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
92a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
92b0: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
92c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
92d0: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
92e0: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
92f0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
9300: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
9310: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
9320: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
9330: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
9340: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
9350: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
9360: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
9370: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
9380: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9390: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
93a0: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
93b0: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
93c0: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
93d0: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
93e0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
93f0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
9400: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
9410: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
9420: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
9430: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
9440: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
9450: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
9460: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
9470: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
9480: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
9490: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
94a0: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
94b0: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
94c0: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
94d0: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
94e0: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
94f0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
9500: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
9510: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
9520: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
9530: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
9540: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
9550: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
9560: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
9570: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
9580: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
9590: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
95a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
95b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
95c0: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
95d0: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
95e0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
95f0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
9600: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
9610: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
9620: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
9630: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
9640: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
9650: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
9660: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
9670: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
9680: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
9690: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
96a0: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
96b0: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
96c0: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
96d0: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
96e0: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
96f0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
9700: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
9710: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
9720: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
9730: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
9740: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
9750: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9770: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
9780: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
9790: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
97a0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
97b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
97c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
97d0: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
97e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
97f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
9800: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
9810: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
9820: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
9830: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
9840: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
9850: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
9860: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
9870: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
9880: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
9890: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
98a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
98b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
98c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
98d0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
98e0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
98f0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
9900: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
9910: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
9920: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
9930: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
9940: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9950: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9960: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9970: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9980: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9990: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
99a0: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
99b0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
99c0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
99d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
99e0: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
99f0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
9a00: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
9a10: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
9a20: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
9a30: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
9a40: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9a50: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9a60: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9a70: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9a80: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9a90: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9aa0: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9ab0: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9ac0: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9ad0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9ae0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
9af0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
9b00: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
9b10: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
9b20: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
9b30: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
9b40: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9b50: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9b60: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9b70: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9b80: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9b90: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9ba0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9bb0: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9bc0: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9be0: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
9bf0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
9c00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
9c10: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
9c20: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 44 69   sqlite3SchemaDi
9c30: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 6a 2c 20  sconnect(db, j, 
9c40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  0);.        pDb-
9c50: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
9c60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9c70: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
9c80: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
9c90: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
9ca0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
9cb0: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
9cc0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
9cd0: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
9ce0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
9cf0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
9d00: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
9d10: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
9d20: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
9d30: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
9d40: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
9d50: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
9d60: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
9d70: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
9d80: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
9d90: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
9da0: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
9db0: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
9dc0: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
9dd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
9de0: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
9df0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
9e00: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
9e10: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
9e20: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
9e30: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
9e40: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
9e50: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9e60: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9e70: 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  c); i; i=sqliteH
9e80: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
9e90: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
9ea0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
9eb0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9ec0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75      do{.      fu
9ed0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9ee0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  , p);.      pNex
9ef0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9f00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9f10: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
9f20: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p = pNext;.    }
9f30: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a  while( p );.  }.
9f40: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9f50: 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a  ar(&db->aFunc);.
9f60: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9f70: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9f80: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
9f90: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9fa0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9fb0: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
9fc0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9fd0: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
9fe0: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
9ff0: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
a000: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a010: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
a020: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
a030: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
a040: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
a050: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
a060: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
a070: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
a080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a090: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a0a0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
a0b0: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
a0c0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
a0d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a0e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
a0f0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
a100: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
a110: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
a120: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
a130: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
a140: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
a150: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
a160: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
a170: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
a180: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
a190: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
a1a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  }.    sqlite3Vta
a1b0: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43  bEponymousTableC
a1c0: 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  lear(db, pMod);.
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a1e0: 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  e(db, pMod);.  }
a1f0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
a200: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
a210: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
a220: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
a230: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
a240: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
a250: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
a260: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
a270: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
a280: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
a290: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
a2a0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
a2b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
a2c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a2d0: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
a2e0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
a2f0: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
a300: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
a310: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
a320: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
a330: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
a340: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
a350: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
a360: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
a370: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
a380: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
a390: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
a3a0: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
a3b0: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
a3c0: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
a3d0: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
a3e0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
a3f0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
a400: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
a410: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
a420: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
a430: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
a440: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
a450: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
a460: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
a470: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
a480: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
a490: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
a4a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a4b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a4c0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
a4d0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
a4e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a4f0: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
a500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a510: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
a520: 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69  (db,0)==0 );.  i
a530: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
a540: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
a550: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a560: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
a570: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  art);.  }.  sqli
a580: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a  te3_free(db);.}.
a590: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
a5a0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
a5b0: 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65  es.  If tripCode
a5c0: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
a5d0: 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77  K, then.** any w
a5e0: 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
a5f0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
a600: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
a610: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
a620: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
a630: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
a640: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
a650: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
a660: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
a670: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
a680: 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73  rsor.  Read curs
a690: 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20  ors remain open 
a6a0: 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74  and valid.** but
a6b0: 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20   are "saved" in 
a6c0: 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70  case the table p
a6d0: 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61  ages are moved a
a6e0: 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  round..*/.void s
a6f0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
a700: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
a710: 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
a720: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54  int i;.  int inT
a730: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rans = 0;.  int 
a740: 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  schemaChange;.  
a750: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a760: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
a770: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
a780: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
a790: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
a7a0: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
a7b0: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
a7c0: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
a7d0: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
a7e0: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
a7f0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
a800: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
a810: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
a820: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
a830: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
a840: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
a850: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
a860: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
a870: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
a880: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
a890: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
a8a0: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
a8b0: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
a8c0: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
a8d0: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
a8e0: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
a8f0: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
a900: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
a910: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
a920: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
a930: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
a940: 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20  .  schemaChange 
a950: 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  = (db->mDbFlags 
a960: 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  & DBFLAG_SchemaC
a970: 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d  hange)!=0 && db-
a980: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a  >init.busy==0;..
a990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a9a0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a9b0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
a9c0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
a9d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66  f( p ){.      if
a9e0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
a9f0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
aa00: 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20        inTrans = 
aa10: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
aa20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
aa30: 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64  lback(p, tripCod
aa40: 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65  e, !schemaChange
aa50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
aa60: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
aa70: 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ck(db);.  sqlite
aa80: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
aa90: 28 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65 6d  ();..  if( schem
aaa0: 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 73  aChange ){.    s
aab0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
aac0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
aad0: 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
aae0: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
aaf0: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
ab00: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ab10: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
ab20: 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66  );..  /* Any def
ab30: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
ab40: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
ab50: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
ab60: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
ab70: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
ab80: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
ab90: 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  mmCons = 0;.  db
aba0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
abb0: 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  )SQLITE_DeferFKs
abc0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
abd0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
abe0: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
abf0: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
ac00: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
ac10: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
ac20: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
ac30: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
ac40: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
ac50: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
ac60: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
ac70: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
ac80: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
ac90: 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  c string contain
aca0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72  ing the name cor
acb0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acc0: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
acd0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
ace0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
acf0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
ad00: 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a  _NEED_ERR_NAME).
ad10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
ad20: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
ad30: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
ad40: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
ad50: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
ad60: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
ad70: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
ad80: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
ad90: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
ada0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
adb0: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
adc0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
add0: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
adf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae00: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
ae10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ae20: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
ae30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
ae40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ae50: 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41  SQLITE_ERROR_SNA
ae60: 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d 65  PSHOT:     zName
ae70: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
ae80: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 62  _SNAPSHOT";    b
ae90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aea0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
aeb0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
aec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
aed0: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
aee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aef0: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
af10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
af20: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
af30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
af40: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
af60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
af70: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
af80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
af90: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
afa0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
afb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
afc0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
afd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
afe0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
aff0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
b000: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b010: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
b020: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b030: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
b040: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
b050: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b060: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
b070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
b090: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
b0a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b0b0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
b0c0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b0d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
b0e0: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
b0f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b100: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
b110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b120: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b130: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
b140: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
b150: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
b160: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
b170: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b180: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
b190: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b1a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
b1b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b1c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b1d0: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
b1e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b1f0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
b200: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b210: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b220: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
b230: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
b240: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b250: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
b260: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b270: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
b280: 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d 20  TINIT:  zName = 
b290: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b2a0: 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65 61  _CANTINIT"; brea
b2b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b2c0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
b2d0: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
b2e0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b2f0: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
b300: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b310: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
b320: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
b330: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b340: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
b350: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b360: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b370: 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d 65  DIRECTORY: zName
b380: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b390: 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b 62  NLY_DIRECTORY";b
b3a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b3b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
b3c0: 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  T:          zNam
b3d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
b3e0: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b3f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b400: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b420: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b430: 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RR";            
b440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b450: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b460: 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e  READ:         zN
b470: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b480: 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20  ERR_READ";      
b490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b4a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b4b0: 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a  _SHORT_READ:   z
b4c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b4d0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22  OERR_SHORT_READ"
b4e0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
b4f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b500: 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20  R_WRITE:        
b510: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b520: 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20  IOERR_WRITE";   
b530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b540: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b550: 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20  RR_FSYNC:       
b560: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b570: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20  _IOERR_FSYNC";  
b580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b590: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b5a0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20  ERR_DIR_FSYNC:  
b5b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b5c0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
b5d0: 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  C";   break;.   
b5e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b5f0: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20  OERR_TRUNCATE:  
b600: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b610: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
b620: 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  E";    break;.  
b630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b640: 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20  IOERR_FSTAT:    
b650: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b660: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22  ITE_IOERR_FSTAT"
b670: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b680: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b690: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20  _IOERR_UNLOCK:  
b6a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b6b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
b6c0: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
b6d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b6e0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20  E_IOERR_RDLOCK: 
b6f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b700: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b710: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
b720: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b730: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a  TE_IOERR_DELETE:
b740: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b750: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b760: 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ETE";      break
b770: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b780: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
b790: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b7a0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  "SQLITE_IOERR_NO
b7b0: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
b7c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b7d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
b7e0: 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  S:       zName =
b7f0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
b800: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      bre
b810: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b820: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
b830: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20  KRESERVEDLOCK:. 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b860: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b870: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
b880: 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  EDLOCK"; break;.
b890: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b8a0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
b8b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b8c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b8d0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b8e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b8f0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20  TE_IOERR_CLOSE: 
b900: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b910: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
b920: 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  SE";       break
b930: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b940: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
b950: 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OSE:    zName = 
b960: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
b970: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61  R_CLOSE";   brea
b980: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b990: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
b9a0: 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EN:      zName =
b9b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b9c0: 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65  HMOPEN";     bre
b9d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b9e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b9f0: 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  IZE:      zName 
ba00: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ba10: 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72  SHMSIZE";     br
ba20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
ba40: 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65  LOCK:      zName
ba50: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ba60: 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62  _SHMLOCK";     b
ba70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
ba90: 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d  MMAP:       zNam
baa0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
bab0: 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20  R_SHMMAP";      
bac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bad0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
bae0: 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EEK:         zNa
baf0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
bb00: 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20  RR_SEEK";       
bb10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb20: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
bb30: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e  DELETE_NOENT: zN
bb40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
bb50: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
bb60: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
bb70: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
bb80: 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a  _MMAP:         z
bb90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
bba0: 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20  OERR_MMAP";     
bbb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bbc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
bbd0: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20  R_GETTEMPPATH:  
bbe0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bbf0: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
bc00: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
bc10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
bc20: 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20  RR_CONVPATH:    
bc30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bc40: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22  _IOERR_CONVPATH"
bc50: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
bc60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bc70: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
bc80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc90: 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20  E_CORRUPT";     
bca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bcb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bcc0: 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20  ORRUPT_VTAB:    
bcd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bce0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22  TE_CORRUPT_VTAB"
bcf0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
bd00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd10: 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20  NOTFOUND:       
bd20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bd30: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20  ITE_NOTFOUND";  
bd40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bd50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bd60: 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20  _FULL:          
bd70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bd80: 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20  LITE_FULL";     
bd90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bda0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bdb0: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20  E_CANTOPEN:     
bdc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bdd0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b  QLITE_CANTOPEN";
bde0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bdf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be00: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
be10: 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  MPDIR: zName = "
be20: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
be30: 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b  NOTEMPDIR";break
be40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
be50: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
be60: 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  IR:     zName = 
be70: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
be80: 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61  _ISDIR";    brea
be90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bea0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
beb0: 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  LLPATH:  zName =
bec0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bed0: 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65  N_FULLPATH"; bre
bee0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bef0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
bf00: 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ONVPATH:  zName 
bf10: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bf20: 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72  EN_CONVPATH"; br
bf30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bf40: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a  SQLITE_PROTOCOL:
bf50: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bf60: 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f   = "SQLITE_PROTO
bf70: 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  COL";          b
bf80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bf90: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20   SQLITE_EMPTY:  
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bfb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54  e = "SQLITE_EMPT
bfc0: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
bfd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bfe0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c000: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48  me = "SQLITE_SCH
c010: 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20  EMA";           
c020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c030: 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  se SQLITE_TOOBIG
c040: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c050: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
c060: 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20  OBIG";          
c070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c080: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c090: 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a  RAINT:         z
c0a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c0b0: 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20  ONSTRAINT";     
c0c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c0d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c0e0: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20  TRAINT_UNIQUE:  
c0f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c100: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
c110: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E"; break;.     
c120: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c130: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a  STRAINT_TRIGGER:
c140: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c150: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
c160: 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  GER";break;.    
c170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c180: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
c190: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c1c0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c1d0: 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62  FOREIGNKEY";   b
c1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c1f0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c200: 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d  NT_CHECK:   zNam
c210: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c220: 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20  TRAINT_CHECK";  
c230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c240: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c250: 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a  INT_PRIMARYKEY:.
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c290: 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
c2a0: 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  RYKEY";   break;
c2b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c2c0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
c2d0: 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  TNULL: zName = "
c2e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c2f0: 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b  T_NOTNULL";break
c300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c310: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
c320: 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20  OMMITHOOK:.     
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c350: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c360: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
c370: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
c380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c390: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20  NSTRAINT_VTAB:  
c3a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c3b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
c3c0: 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  B";   break;.   
c3d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c3e0: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
c3f0: 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ON:.            
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c420: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
c430: 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72  UNCTION";     br
c440: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c450: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c460: 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65  T_ROWID:   zName
c470: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c480: 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62  RAINT_ROWID";  b
c490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c4a0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c4b0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
c4c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d  e = "SQLITE_MISM
c4d0: 41 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20  ATCH";          
c4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c4f0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c510: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
c520: 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  USE";           
c530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c540: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a  se SQLITE_NOLFS:
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c560: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c570: 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20  LFS";           
c580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c590: 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a  ase SQLITE_AUTH:
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c5b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
c5c0: 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20  UTH";           
c5d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c5e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d  case SQLITE_FORM
c5f0: 41 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  AT:             
c600: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c610: 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20  FORMAT";        
c620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c630: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e   case SQLITE_RAN
c640: 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  GE:             
c650: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c660: 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20  _RANGE";        
c670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c680: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c690: 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20  TADB:           
c6a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c6b0: 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20  E_NOTADB";      
c6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c6d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
c6e0: 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OW:             
c6f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c700: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
c710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c720: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c730: 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20  NOTICE:         
c740: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c750: 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20  ITE_NOTICE";    
c760: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c770: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c780: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c790: 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  WAL: zName = "SQ
c7a0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c7b0: 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a  VER_WAL";break;.
c7c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c7d0: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
c7e0: 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20  _ROLLBACK:.     
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c810: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
c820: 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
c830: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
c840: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
c850: 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20  RNING:          
c860: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c870: 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20  E_WARNING";     
c880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c890: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
c8a0: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
c8b0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
c8c0: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
c8d0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
c8e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c8f0: 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20  DONE:           
c900: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c910: 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20  ITE_DONE";      
c920: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c930: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
c940: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Name==0 ){.    s
c950: 74 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b  tatic char zBuf[
c960: 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  50];.    sqlite3
c970: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
c980: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53  (zBuf), zBuf, "S
c990: 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64  QLITE_UNKNOWN(%d
c9a0: 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20  )", origRc);.   
c9b0: 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20   zName = zBuf;. 
c9c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
c9d0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
c9e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
c9f0: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  ic string that d
ca00: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
ca10: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
ca20: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
ca30: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
ca40: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
ca50: 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrStr(int rc){. 
ca60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
ca70: 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d  ar* const aMsg[]
ca80: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49   = {.    /* SQLI
ca90: 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a  TE_OK          *
caa0: 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22  / "not an error"
cab0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cac0: 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22  ERROR       */ "
cad0: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 22  SQL logic error"
cae0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
caf0: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
cb00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cb10: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
cb20: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
cb30: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
cb40: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
cb50: 20 20 20 20 20 2a 2f 20 22 71 75 65 72 79 20 61       */ "query a
cb60: 62 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20  borted",.    /* 
cb70: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
cb80: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
cb90: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
cba0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
cbb0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
cbc0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
cbd0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cbe0: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
cbf0: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
cc00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cc10: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
cc20: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
cc30: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
cc40: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
cc50: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
cc60: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
cc70: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
cc80: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
cc90: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
cca0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
ccb0: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
ccc0: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
ccd0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
cce0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ccf0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
cd00: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
cd10: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
cd20: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
cd30: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
cd40: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
cd50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
cd60: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
cd70: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
cd80: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
cd90: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
cda0: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
cdb0: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
cdc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
cdd0: 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20         */ 0,.   
cde0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
cdf0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
ce00: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
ce10: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
ce20: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
ce30: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
ce40: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
ce50: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
ce60: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
ce70: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
ce80: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ce90: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
cea0: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
ceb0: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
cec0: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
ced0: 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72 20   "bad parameter 
cee0: 6f 72 20 6f 74 68 65 72 20 41 50 49 20 6d 69 73  or other API mis
cef0: 75 73 65 22 2c 0a 23 69 66 64 65 66 20 53 51 4c  use",.#ifdef SQL
cf00: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
cf10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
cf20: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61  LFS       */ "la
cf30: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
cf40: 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 23   is disabled",.#
cf50: 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c 49  else.    /* SQLI
cf60: 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a  TE_NOLFS       *
cf70: 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  / 0,.#endif.    
cf80: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
cf90: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
cfa0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
cfb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
cfc0: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 30 2c  ORMAT      */ 0,
cfd0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
cfe0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 63  ANGE       */ "c
cff0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20  olumn index out 
d000: 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f  of range",.    /
d010: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  * SQLITE_NOTADB 
d020: 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73       */ "file is
d030: 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22   not a database"
d040: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
d050: 4e 4f 54 49 43 45 20 20 20 20 20 20 2a 2f 20 22  NOTICE      */ "
d060: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d 65 73  notification mes
d070: 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  sage",.    /* SQ
d080: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 20 20 20  LITE_WARNING    
d090: 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d 65 73   */ "warning mes
d0a0: 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f  sage",.  };.  co
d0b0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
d0c0: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
d0d0: 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ;.  switch( rc )
d0e0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
d0f0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
d100: 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  : {.      zErr =
d110: 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52   "abort due to R
d120: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
d130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d140: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
d150: 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  : {.      zErr =
d160: 20 22 61 6e 6f 74 68 65 72 20 72 6f 77 20 61 76   "another row av
d170: 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20 20  ailable";.      
d180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d190: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
d1a0: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  E: {.      zErr 
d1b0: 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20  = "no more rows 
d1c0: 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20  available";.    
d1d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d1e0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
d1f0: 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a      rc &= 0xff;.
d200: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
d210: 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72  (rc>=0) && rc<Ar
d220: 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26  raySize(aMsg) &&
d230: 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a   aMsg[rc]!=0 ){.
d240: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61          zErr = a
d250: 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d  Msg[rc];.      }
d260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d270: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d280: 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zErr;.}../*.** 
d290: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
d2a0: 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63  lements a busy c
d2b0: 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65  allback that sle
d2c0: 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a  eps and tries.**
d2d0: 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74   again until a t
d2e0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20  imeout value is 
d2f0: 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69  reached.  The ti
d300: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a  meout value is.*
d310: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  * an integer num
d320: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
d330: 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73  nds passed in as
d340: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
d350: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  gument..**.** Re
d360: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  turn non-zero to
d370: 20 72 65 74 72 79 20 74 68 65 20 6c 6f 63 6b 2e   retry the lock.
d380: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 74 6f    Return zero to
d390: 20 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a 2a 20   stop trying.** 
d3a0: 61 6e 64 20 63 61 75 73 65 20 53 51 4c 69 74 65  and cause SQLite
d3b0: 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
d3c0: 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61 74 69  E_BUSY..*/.stati
d3d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61  c int sqliteDefa
d3e0: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28  ultBusyCallback(
d3f0: 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  .  void *ptr,   
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
d410: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d420: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e  on */.  int coun
d430: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d440: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
d450: 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  mes table has be
d460: 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73 71 6c  en busy */.  sql
d470: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
d480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
d490: 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c  e on which the l
d4a0: 6f 63 6b 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ock occurred */.
d4b0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
d4c0: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
d4d0: 45 45 50 0a 20 20 2f 2a 20 54 68 69 73 20 63 61  EEP.  /* This ca
d4e0: 73 65 20 69 73 20 66 6f 72 20 73 79 73 74 65 6d  se is for system
d4f0: 73 20 74 68 61 74 20 68 61 76 65 20 73 75 70 70  s that have supp
d500: 6f 72 74 20 66 6f 72 20 73 6c 65 65 70 69 6e 67  ort for sleeping
d510: 20 66 6f 72 20 66 72 61 63 74 69 6f 6e 73 20 6f   for fractions o
d520: 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 2e  f.  ** a second.
d530: 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 41 6c 6c    Examples:  All
d540: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
d550: 2c 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20 77  , unix systems w
d560: 69 74 68 20 75 73 6c 65 65 70 28 29 20 2a 2f 0a  ith usleep() */.
d570: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
d580: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
d590: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
d5a0: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
d5b0: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
d5c0: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
d5d0: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
d5e0: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
d5f0: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
d600: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
d610: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
d620: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
d630: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
d640: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d650: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
d660: 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 64 62    int tmout = db
d670: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
d680: 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f   int delay, prio
d690: 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  r;..#ifdef SQLIT
d6a0: 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
d6b0: 49 4d 45 4f 55 54 0a 20 20 69 66 28 20 73 71 6c  IMEOUT.  if( sql
d6c0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
d6d0: 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54 45 5f 46  l(pFile,SQLITE_F
d6e0: 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55  CNTL_LOCK_TIMEOU
d6f0: 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c 49 54  T,&tmout)==SQLIT
d700: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
d710: 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 74  count ){.      t
d720: 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mout = 0;.      
d730: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d740: 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49  trol(pFile, SQLI
d750: 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49  TE_FCNTL_LOCK_TI
d760: 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29 3b 0a  MEOUT, &tmout);.
d770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
d780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d790: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
d7a0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
d7b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46  SED_PARAMETER(pF
d7c0: 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ile);.#endif.  a
d7d0: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
d7e0: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
d7f0: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
d800: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
d810: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
d820: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
d830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
d840: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
d850: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
d860: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
d870: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
d880: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
d890: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
d8a0: 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f 75 74   + delay > tmout
d8b0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
d8c0: 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20  tmout - prior;. 
d8d0: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
d8e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
d8f0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
d900: 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79  (db->pVfs, delay
d910: 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  *1000);.  return
d920: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54   1;.#else.  /* T
d930: 68 69 73 20 63 61 73 65 20 66 6f 72 20 75 6e 69  his case for uni
d940: 78 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 6c  x systems that l
d950: 61 63 6b 20 75 73 6c 65 65 70 28 29 20 73 75 70  ack usleep() sup
d960: 70 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e 67 0a  port.  Sleeping.
d970: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 64 6f 6e    ** must be don
d980: 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  e in increments 
d990: 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e 64 73  of whole seconds
d9a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d9b0: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
d9c0: 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20  tr;.  int tmout 
d9d0: 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74  = ((sqlite3 *)pt
d9e0: 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  r)->busyTimeout;
d9f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
da00: 54 45 52 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  TER(pFile);.  if
da10: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
da20: 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20   > tmout ){.    
da30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
da40: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
da50: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
da60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
da70: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
da80: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
da90: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
daa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dab0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
dac0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
dad0: 6c 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  led to acquire a
dae0: 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46 53 20  .** lock on VFS 
daf0: 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a 2a  file pFile..**.*
db00: 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
db10: 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  e returns non-ze
db20: 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
db30: 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a  retried.  If it.
db40: 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68  ** returns 0, th
db50: 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72  e operation abor
db60: 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ts with an SQLIT
db70: 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f  E_BUSY error..*/
db80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f  .int sqlite3Invo
db90: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75  keBusyHandler(Bu
dba0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20 73 71  syHandler *p, sq
dbb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
dbc0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
dbd0: 69 66 28 20 70 2d 3e 78 42 75 73 79 48 61 6e 64  if( p->xBusyHand
dbe0: 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  ler==0 || p->nBu
dbf0: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
dc00: 0a 20 20 69 66 28 20 70 2d 3e 62 45 78 74 72 61  .  if( p->bExtra
dc10: 46 69 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 2f  FileArg ){.    /
dc20: 2a 20 41 64 64 20 61 6e 20 65 78 74 72 61 20 70  * Add an extra p
dc30: 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74 68  arameter with th
dc40: 65 20 70 46 69 6c 65 20 70 6f 69 6e 74 65 72 20  e pFile pointer 
dc50: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
dc60: 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63  e.    ** callbac
dc70: 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  k argument list 
dc80: 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78 54 72  */.    int (*xTr
dc90: 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  a)(void*,int,sql
dca0: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20 20 20  ite3_file*);.   
dcb0: 20 78 54 72 61 20 3d 20 28 69 6e 74 28 2a 29 28   xTra = (int(*)(
dcc0: 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  void*,int,sqlite
dcd0: 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42 75 73  3_file*))p->xBus
dce0: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 72 63  yHandler;.    rc
dcf0: 20 3d 20 78 54 72 61 28 70 2d 3e 70 42 75 73 79   = xTra(p->pBusy
dd00: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c 20 70  Arg, p->nBusy, p
dd10: 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  File);.  }else{.
dd20: 20 20 20 20 2f 2a 20 4c 65 67 61 63 79 20 73 74      /* Legacy st
dd30: 79 6c 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  yle busy handler
dd40: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20   callback */.   
dd50: 20 72 63 20 3d 20 70 2d 3e 78 42 75 73 79 48 61   rc = p->xBusyHa
dd60: 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73 79 41 72  ndler(p->pBusyAr
dd70: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
dd80: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
dd90: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
dda0: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
ddb0: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
ddc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
ddd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
dde0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
ddf0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
de00: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
de10: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
de20: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
de30: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
de40: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
de50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
de60: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
de70: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
de80: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
de90: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
dea0: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
deb0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dec0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ded0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
dee0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
def0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
df00: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
df10: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
df20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
df30: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 42 75 73  busyHandler.xBus
df40: 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
df50: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
df60: 6c 65 72 2e 70 42 75 73 79 41 72 67 20 3d 20 70  ler.pBusyArg = p
df70: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
df80: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
df90: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
dfa0: 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72  ler.bExtraFileAr
dfb0: 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  g = 0;.  db->bus
dfc0: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
dfd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
dfe0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
dff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e000: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
e010: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
e020: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
e030: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e040: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
e050: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
e060: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
e070: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
e080: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
e090: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
e0a0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
e0b0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
e0c0: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
e0d0: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
e0e0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
e0f0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
e100: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
e110: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
e120: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
e130: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
e140: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
e150: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
e160: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e170: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e180: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e190: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
e1a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e1b0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
e1c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
e1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e1e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
e1f0: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
e200: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
e210: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
e220: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
e230: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
e240: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
e250: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
e260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
e270: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
e280: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
e290: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
e2a0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
e2b0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
e2c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
e2d0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
e2e0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
e2f0: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
e300: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
e310: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
e320: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
e330: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
e340: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
e350: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
e360: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
e370: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
e380: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e390: 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ms){.#ifdef SQLI
e3a0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e3b0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e3c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e3d0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
e3e0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e3f0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73  .#endif.  if( ms
e400: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
e410: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
e420: 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a  b, (int(*)(void*
e430: 2c 69 6e 74 29 29 73 71 6c 69 74 65 44 65 66 61  ,int))sqliteDefa
e440: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
e450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
e470: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62  oid*)db);.    db
e480: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
e490: 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  ms;.    db->busy
e4a0: 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69  Handler.bExtraFi
e4b0: 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  leArg = 1;.  }el
e4c0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
e4d0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
e4e0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
e4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e500: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
e510: 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61  ny pending opera
e520: 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20  tion to stop at 
e530: 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70  its earliest opp
e540: 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69  ortunity..*/.voi
e550: 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  d sqlite3_interr
e560: 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  upt(sqlite3 *db)
e570: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e580: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e590: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e5a0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e5b0: 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62   && (db==0 || db
e5c0: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
e5d0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b  MAGIC_ZOMBIE) ){
e5e0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e5f0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
e610: 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69  endif.  db->u1.i
e620: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
e630: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
e640: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
e650: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
e660: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e670: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
e680: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
e690: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
e6a0: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
e6b0: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
e6c0: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
e6d0: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
e6e0: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
e6f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e700: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
e710: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
e720: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
e730: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
e740: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
e750: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
e760: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
e770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
e780: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
e790: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
e7a0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
e7b0: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
e7c0: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
e7d0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e7e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
e7f0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
e800: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e810: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e820: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
e830: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
e840: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
e850: 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69  d (*xValue)(sqli
e860: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e870: 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65   void (*xInverse
e880: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e890: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e8a0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75 6e 63  alue **),.  Func
e8b0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
e8c0: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
e8d0: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
e8e0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72  Name;.  int extr
e8f0: 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72  aFlags;..  asser
e900: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e910: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e920: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78 56   );.  assert( xV
e930: 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46 75 6e  alue==0 || xSFun
e940: 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 46  c==0 );.  if( zF
e950: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 20  unctionName==0  
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e970: 20 4d 75 73 74 20 68 61 76 65 20 61 20 76 61 6c   Must have a val
e980: 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c 7c  id name */.   ||
e990: 20 28 78 53 46 75 6e 63 21 3d 30 20 26 26 20 78   (xSFunc!=0 && x
e9a0: 46 69 6e 61 6c 21 3d 30 29 20 20 20 20 20 20 20  Final!=0)       
e9b0: 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78 53 46   /* Not both xSF
e9c0: 75 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c 20 2a  unc and xFinal *
e9d0: 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e 61 6c  /.   || ((xFinal
e9e0: 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d 30 29  ==0)!=(xStep==0)
e9f0: 29 20 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20  )       /* Both 
ea00: 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78 46  or neither of xF
ea10: 69 6e 61 6c 20 61 6e 64 20 78 53 74 65 70 20 2a  inal and xStep *
ea20: 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c 75 65  /.   || ((xValue
ea30: 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72 73 65 3d  ==0)!=(xInverse=
ea40: 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f 74 68 20  =0))    /* Both 
ea50: 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78 56  or neither of xV
ea60: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 20 2a  alue, xInverse *
ea70: 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c 2d 31  /.   || (nArg<-1
ea80: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
ea90: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
eaa0: 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28 6e 4e  ).   || (255<(nN
eab0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
eac0: 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e  len30( zFunction
ead0: 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20 20 20  Name))).  ){.   
eae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
eaf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
eb00: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
eb10: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d  E_FUNC_CONSTANT=
eb20: 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e  =SQLITE_DETERMIN
eb30: 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61  ISTIC );.  extra
eb40: 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53  Flags = enc &  S
eb50: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
eb60: 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53  TIC;.  enc &= (S
eb70: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
eb80: 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a  SK|SQLITE_ANY);.
eb90: 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54    .#ifndef SQLIT
eba0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
ebb0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
ebc0: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
ebd0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
ebe0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
ebf0: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
ec00: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
ec10: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
ec20: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
ec30: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
ec40: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
ec50: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
ec60: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
ec70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53  ..  **.  ** If S
ec80: 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65  QLITE_ANY is spe
ec90: 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65  cified, add thre
eca0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
ecb0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  e function.  ** 
ecc0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
ecd0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e  e..  */.  if( en
ece0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  c==SQLITE_UTF16 
ecf0: 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c  ){.    enc = SQL
ed00: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
ed10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63  .  }else if( enc
ed20: 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a  ==SQLITE_ANY ){.
ed30: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
ed40: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
ed50: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
ed60: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
ed70: 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72  SQLITE_UTF8|extr
ed80: 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  aFlags,.        
ed90: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
eda0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
edb0: 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  l, xValue, xInve
edc0: 72 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f 72  rse, pDestructor
edd0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ede0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
edf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
ee00: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
ee10: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
ee20: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
ee30: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
ee40: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
ee50: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
ee60: 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c   xFinal, xValue,
ee70: 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74   xInverse, pDest
ee80: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
ee90: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
eea0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
eeb0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
eec0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
eed0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
eee0: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
eef0: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
ef00: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
ef10: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
ef20: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
ef30: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
ef40: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
ef50: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
ef60: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
ef70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ef80: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
ef90: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
efa0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
efb0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
efc0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
efd0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
efe0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
eff0: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
f000: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
f010: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
f020: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
f030: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
f040: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
f050: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
f060: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
f070: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
f080: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
f090: 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20 26  ASK)==(u32)enc &
f0a0: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
f0b0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
f0c0: 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
f0d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f0e0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
f0f0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
f100: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
f110: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
f120: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
f130: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
f140: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
f150: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
f160: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
f170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f180: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f190: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
f1a0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
f1b0: 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d  ts(db, 0);.    }
f1c0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
f1d0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
f1e0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
f1f0: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
f200: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
f210: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
f220: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
f230: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f240: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
f250: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
f260: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
f270: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
f280: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
f290: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
f2a0: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
f2b0: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
f2c0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
f2d0: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
f2e0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
f2f0: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
f300: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
f310: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
f320: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70  ++;.  }.  p->u.p
f330: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65  Destructor = pDe
f340: 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66  structor;.  p->f
f350: 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66  uncFlags = (p->f
f360: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
f370: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20  E_FUNC_ENCMASK) 
f380: 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20  | extraFlags;.  
f390: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e  testcase( p->fun
f3a0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
f3b0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
f3c0: 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78  .  p->xSFunc = x
f3d0: 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a  SFunc ? xSFunc :
f3e0: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
f3f0: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
f400: 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20 78  .  p->xValue = x
f410: 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e 76  Value;.  p->xInv
f420: 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73 65 3b  erse = xInverse;
f430: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
f440: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
f450: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
f460: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
f470: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f480: 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   Worker function
f490: 20 75 73 65 64 20 62 79 20 75 74 66 2d 38 20 41   used by utf-8 A
f4a0: 50 49 73 20 74 68 61 74 20 63 72 65 61 74 65 20  PIs that create 
f4b0: 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  new functions:.*
f4c0: 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  *.**    sqlite3_
f4d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
f4e0: 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ).**    sqlite3_
f4f0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
f500: 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74  v2().**    sqlit
f510: 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77  e3_create_window
f520: 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a 73  _function().*/.s
f530: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
f540: 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20 73  FunctionApi(.  s
f550: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
f560: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
f570: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
f580: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
f590: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
f5a0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
f5b0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f5c0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
f5d0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
f5e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f5f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
f600: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f610: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f620: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
f630: 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
f640: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
f650: 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c   (*xInverse)(sql
f660: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f670: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f680: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 73  *),.  void(*xDes
f690: 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  troy)(void*).){.
f6a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f6b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
f6c0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
f6d0: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
f6e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f6f0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f700: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f710: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f720: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f730: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
f740: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f750: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f760: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
f770: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
f780: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
f790: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
f7a0: 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74  (sizeof(FuncDest
f7b0: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
f7c0: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
f7d0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f7e0: 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73  (db);.      xDes
f7f0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
f800: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
f810: 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20     pArg->nRef = 
f820: 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65  0;.    pArg->xDe
f830: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
f840: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
f850: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
f860: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
f870: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
f880: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
f890: 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63 2c 20   .      xSFunc, 
f8a0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78  xStep, xFinal, x
f8b0: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c  Value, xInverse,
f8c0: 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69 66 28   pArg.  );.  if(
f8d0: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e   pArg && pArg->n
f8e0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
f8f0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
f900: 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74  _OK );.    xDest
f910: 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  roy(p);.    sqli
f920: 74 65 33 5f 66 72 65 65 28 70 41 72 67 29 3b 0a  te3_free(pArg);.
f930: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
f940: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
f950: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
f960: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f970: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f980: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f990: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
f9a0: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
f9b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
f9c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
f9d0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
f9e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
f9f0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
fa00: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
fa10: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
fa20: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
fa30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fa40: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
fa50: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
fa60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fa70: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fa80: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
fa90: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
faa0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
fab0: 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f  rn createFunctio
fac0: 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20  nApi(db, zFunc, 
fad0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53  nArg, enc, p, xS
fae0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20  Func, xStep,.   
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 30   xFinal, 0, 0, 0
fb20: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
fb30: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
fb40: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
fb50: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
fb60: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
fb70: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
fb80: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
fb90: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
fba0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fbb0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fbc0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
fbd0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
fbe0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fbf0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
fc00: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
fc10: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
fc20: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
fc30: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
fc40: 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e  return createFun
fc50: 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75  ctionApi(db, zFu
fc60: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
fc70: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
fc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20       xFinal, 0, 
fcb0: 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a  0, xDestroy);.}.
fcc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
fcd0: 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69  te_window_functi
fce0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
fcf0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
fd00: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
fd10: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
fd20: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
fd30: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
fd40: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
fd50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
fd60: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
fd70: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
fd80: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
fd90: 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
fda0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
fdb0: 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c   (*xInverse)(sql
fdc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fdd0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fde0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  **),.  void (*xD
fdf0: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
fe00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61  ){.  return crea
fe10: 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62  teFunctionApi(db
fe20: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
fe30: 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65 70 2c  nc, p, 0, xStep,
fe40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78 56 61       xFinal, xVa
fe70: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 78  lue, xInverse, x
fe80: 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69 66  Destroy);.}..#if
fe90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fea0: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
feb0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
fec0: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
fed0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
fee0: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
fef0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
ff00: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
ff10: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
ff20: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
ff30: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
ff40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
ff50: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
ff60: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ff70: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
ff80: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
ff90: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
ffa0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
ffb0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
ffc0: 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20  zFunc8;..#ifdef 
ffd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
ffe0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
fff0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10000 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63  kOk(db) || zFunc
10010 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65  tionName==0 ) re
10020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10030 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
10040 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10050 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10060 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
10070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10080 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
10090 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
100a0 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
100b0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
100c0 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
100d0 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
100e0 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
100f0 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
10100 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69  xSFunc,xStep,xFi
10110 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73 71  nal,0,0,0);.  sq
10120 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10130 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
10140 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
10150 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
10160 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10170 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10180 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
10190 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
101a0 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70  owing is the imp
101b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
101c0 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  n SQL function t
101d0 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61  hat always.** fa
101e0 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ils with an erro
101f0 72 20 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e  r message statin
10200 67 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  g that the funct
10210 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74  ion is used in t
10220 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74  he.** wrong cont
10230 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ext.  The sqlite
10240 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
10250 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20  ion() API might 
10260 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c  construct.** SQL
10270 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75   function that u
10280 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
10290 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
102a0 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74  tions will exist
102b0 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  .** for name res
102c0 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20  olution but are 
102d0 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61  actually overloa
102e0 64 65 64 20 62 79 20 74 68 65 20 78 46 69 6e 64  ded by the xFind
102f0 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68  Function.** meth
10300 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  od of virtual ta
10310 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
10320 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61  void sqlite3Inva
10330 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  lidFunction(.  s
10340 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
10350 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65  context,  /* The
10360 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e   function callin
10370 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
10380 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  nt NotUsed,     
10390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
103a0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
103b0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
103c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
103d0 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20  lue **NotUsed2  
103e0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63   /* Value of eac
103f0 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
10400 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10410 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
10420 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  ar*)sqlite3_user
10430 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
10440 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
10450 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10460 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
10470 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73  ed2);.  zErr = s
10480 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
10490 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
104a0 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73   use function %s
104b0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
104c0 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d  d context", zNam
104d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  e);.  sqlite3_re
104e0 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
104f0 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20  xt, zErr, -1);. 
10500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
10510 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  rr);.}../*.** De
10520 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
10530 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
10540 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
10550 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
10560 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
10570 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
10580 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
10590 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
105a0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
105b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
105c0 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
105d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
105e0 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
105f0 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
10600 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
10610 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
10620 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
10630 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
10640 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
10650 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
10660 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
10670 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
10680 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
10690 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
106a0 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
106b0 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
106c0 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
106d0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
106e0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
106f0 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
10700 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10710 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
10720 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
10730 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
10740 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
10750 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Arg.){.  int rc;
10760 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a  .  char *zCopy;.
10770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10780 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10790 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
107a0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
107b0 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e  || zName==0 || n
107c0 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65  Arg<-2 ){.    re
107d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
107e0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
107f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10800 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10810 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  tex);.  rc = sql
10820 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
10830 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
10840 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
10850 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )!=0;.  sqlite3_
10860 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10870 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63  mutex);.  if( rc
10880 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10890 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73  _OK;.  zCopy = s
108a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a  qlite3_mprintf(z
108b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
108c0 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  py==0 ) return S
108d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
108e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
108f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
10900 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
10910 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10930 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c            zCopy,
10940 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
10950 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73  unction, 0, 0, s
10960 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
10970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10980 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
10990 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
109a0 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
109b0 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
109c0 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
109d0 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73  ered trace.** is
109e0 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
109f0 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20  ** A NULL trace 
10a00 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
10a10 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69  hat no tracing i
10a20 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
10a30 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65  on-NULL.** trace
10a40 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
10a50 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
10a60 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
10a70 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
10a80 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  .** SQL statemen
10a90 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
10aa0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10ab0 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ATED.void *sqlit
10ac0 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
10ad0 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61   *db, void(*xTra
10ae0 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
10af0 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
10b00 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
10b10 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
10b20 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10b30 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10b40 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10b50 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
10b60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10b70 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
10b80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10b90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10ba0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10bb0 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
10bc0 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72  ceArg;.  db->mTr
10bd0 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53  ace = xTrace ? S
10be0 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41  QLITE_TRACE_LEGA
10bf0 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54  CY : 0;.  db->xT
10c00 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75  race = (int(*)(u
10c10 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  32,void*,void*,v
10c20 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20  oid*))xTrace;.  
10c30 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
10c40 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10c50 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10c60 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10c70 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
10c80 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
10c90 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a  EPRECATED */../*
10ca0 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
10cb0 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  e callback using
10cc0 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69   the version-2 i
10cd0 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
10ce0 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
10cf0 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
10d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f  /* Trace this co
10d30 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  nnection */.  un
10d40 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20  signed mTrace,  
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10d70 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65   of events to be
10d80 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74   traced */.  int
10d90 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e  (*xTrace)(unsign
10da0 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  ed,void*,void*,v
10db0 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62  oid*),  /* Callb
10dc0 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f  ack to invoke */
10dd0 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
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 20 20 20 20 2f 2a                /*
10e00 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23   Context */.){.#
10e10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e20 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10e30 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10e40 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10e50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10e60 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10e70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
10e80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10e90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
10ea0 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78  f( mTrace==0 ) x
10eb0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28  Trace = 0;.  if(
10ec0 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72   xTrace==0 ) mTr
10ed0 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d  ace = 0;.  db->m
10ee0 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a  Trace = mTrace;.
10ef0 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
10f00 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
10f10 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
10f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10f30 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10f40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10f50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
10f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10f70 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67  ECATED./*.** Reg
10f80 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
10f90 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
10fa0 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
10fb0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
10fc0 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
10fd0 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
10fe0 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
10ff0 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
11000 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
11010 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
11020 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
11030 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
11040 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
11050 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
11060 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
11070 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
11080 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
11090 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
110a0 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
110b0 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
110c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
110d0 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
110e0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
110f0 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
11100 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
11110 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
11120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11130 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
11140 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11150 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
11160 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
11170 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
11180 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11190 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
111a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
111b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
111c0 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
111d0 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
111e0 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
111f0 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
11200 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d  rg = pArg;.  db-
11210 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c 49 54  >mTrace &= SQLIT
11220 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47 41 43  E_TRACE_NONLEGAC
11230 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 64 62  Y_MASK;.  if( db
11240 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64 62 2d  ->xProfile ) db-
11250 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c 49 54  >mTrace |= SQLIT
11260 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49 4c 45  E_TRACE_XPROFILE
11270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
11280 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
11290 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
112a0 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
112b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
112c0 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20  CATED */.#endif 
112d0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
112e0 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
112f0 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
11300 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
11310 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11320 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
11330 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
11340 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11350 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
11360 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
11370 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
11380 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
11390 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
113a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
113b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
113c0 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
113d0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
113e0 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
113f0 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
11400 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
11410 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
11420 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
11430 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
11440 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
11450 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
11460 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
11470 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11480 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
11490 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
114a0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
114b0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
114c0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
114d0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
114e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
114f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11500 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11510 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
11520 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
11530 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
11540 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
11550 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
11560 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
11570 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11580 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
11590 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
115a0 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
115b0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
115c0 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
115d0 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
115e0 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
115f0 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
11600 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11610 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
11620 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
11630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11650 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
11660 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
11670 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
11680 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
11690 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
116a0 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
116b0 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
116c0 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
116d0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
116e0 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
116f0 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
11700 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pRet;..#ifdef SQ
11710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
11720 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
11730 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
11740 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
11750 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
11760 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
11770 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
11780 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11790 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
117a0 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
117b0 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
117c0 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
117d0 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
117e0 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
117f0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11800 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11810 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11820 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
11830 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
11840 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
11850 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
11860 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
11870 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
11880 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
11890 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
118a0 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
118b0 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
118c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
118d0 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
118e0 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
118f0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
11900 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
11910 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
11920 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
11930 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11950 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
11960 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
11970 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
11980 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11990 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
119a0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
119b0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
119c0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
119d0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
119e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
119f0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11a00 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11a10 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
11a20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
11a30 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
11a40 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
11a50 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
11a60 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
11a70 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11a80 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11a90 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11aa0 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
11ab0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
11ac0 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a  UPDATE_HOOK./*.*
11ad0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
11ae0 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
11af0 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
11b00 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
11b10 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
11b20 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
11b30 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
11b40 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
11b50 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
11b60 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
11b70 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11b80 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
11b90 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
11ba0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
11bb0 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20  d(*xCallback)(  
11bc0 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61         /* Callba
11bd0 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
11be0 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33     void*,sqlite3
11bf0 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
11c00 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71  *,char const*,sq
11c10 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69  lite3_int64,sqli
11c20 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te3_int64),.  vo
11c30 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
11c40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11c50 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65   callback argume
11c60 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  nt */.){.  void 
11c70 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
11c80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11c90 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
11ca0 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  = db->pPreUpdate
11cb0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  Arg;.  db->xPreU
11cc0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
11cd0 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11ce0 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20 3d  >pPreUpdateArg =
11cf0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11d00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11d10 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11d20 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
11d30 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11d40 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
11d50 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11d60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
11d70 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
11d80 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
11d90 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
11da0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
11db0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
11dc0 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
11dd0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
11de0 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
11df0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
11e00 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
11e10 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
11e20 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
11e30 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
11e40 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
11e50 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
11e60 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
11e70 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
11e80 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
11e90 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
11ea0 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
11eb0 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
11ec0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11ed0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
11ee0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11ef0 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
11f00 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11f10 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
11f20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
11f30 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
11f40 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
11f50 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
11f60 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
11f70 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
11f80 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
11f90 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11fa0 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
11fb0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11fc0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
11fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11fe0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
12000 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
12010 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
12020 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
12030 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
12040 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
12050 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
12060 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
12070 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
12080 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
12090 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
120a0 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
120b0 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
120c0 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
120d0 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
120e0 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
120f0 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
12100 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
12110 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
12120 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
12130 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
12140 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
12150 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
12160 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
12170 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
12180 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
12190 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
121a0 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
121b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
121c0 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
121d0 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
121e0 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
121f0 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
12200 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
12210 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
12220 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
12230 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
12240 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
12250 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12260 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
12270 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
12280 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12290 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
122a0 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  se.#ifdef SQLITE
122b0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
122c0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
122d0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
122e0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
122f0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
12300 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61  endif.  if( nFra
12310 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  me>0 ){.    sqli
12320 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
12330 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
12340 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49  ltHook, SQLITE_I
12350 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65  NT_TO_PTR(nFrame
12360 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
12370 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
12380 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  k(db, 0, 0);.  }
12390 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
123a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
123b0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
123c0 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
123d0 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
123e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
123f0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
12400 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
12410 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61  d-log by this da
12420 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12430 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
12440 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20  te3_wal_hook(.  
12450 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
12480 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61  ok to this db ha
12490 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ndle */.  int(*x
124a0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
124b0 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
124c0 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20  t char*, int),. 
124d0 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
12500 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61  nt passed to xCa
12510 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23  llback() */.){.#
12520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12530 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70  IT_WAL.  void *p
12540 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Ret;.#ifdef SQLI
12550 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
12560 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
12570 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
12580 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
12590 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
125a0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
125b0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
125c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
125d0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
125e0 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61    pRet = db->pWa
125f0 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c  lArg;.  db->xWal
12600 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
12610 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c  back;.  db->pWal
12620 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
12630 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12640 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12650 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c  return pRet;.#el
12660 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
12670 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
12680 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
12690 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73  se zDb..*/.int s
126a0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
126b0 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69  point_v2(.  sqli
126c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
126d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
126e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
126f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12700 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
12710 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
12720 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12730 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
12740 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20  int eMode,      
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  /* SQLITE_CHECKP
12770 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  OINT_* value */.
12780 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20    int *pnLog,   
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
127b0 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61  f WAL log in fra
127c0 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
127d0 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20  Ckpt            
127e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
127f0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
12800 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69   frames checkpoi
12810 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  nted */.){.#ifde
12820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
12830 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
12840 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
12850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12870 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
12880 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
12890 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
128a0 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
128b0 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
128c0 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
128d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
128e0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
128f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
12900 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
12910 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12920 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
12930 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  dif..  /* Initia
12940 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
12950 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
12960 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
12970 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
12980 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
12990 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
129a0 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
129b0 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
129c0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
129d0 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20  _PASSIVE==0 );. 
129e0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
129f0 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d  CHECKPOINT_FULL=
12a00 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
12a10 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12a20 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a  T_RESTART==2 );.
12a30 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
12a40 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
12a50 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28  CATE==3 );.  if(
12a60 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48   eMode<SQLITE_CH
12a70 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12a80 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45   || eMode>SQLITE
12a90 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
12aa0 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45  CATE ){.    /* E
12ab0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
12ac0 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20  996-12088 The M 
12ad0 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
12ae0 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70  e a valid checkp
12af0 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  oint.    ** mode
12b00 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  : */.    return 
12b10 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
12b20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
12b30 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12b40 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20  tex);.  if( zDb 
12b50 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20  && zDb[0] ){.   
12b60 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
12b70 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
12b80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
12b90 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
12ba0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12bb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
12bc0 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
12bd0 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
12be0 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
12bf0 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
12c00 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
12c10 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  r.nBusy = 0;.   
12c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
12c30 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c  ckpoint(db, iDb,
12c40 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
12c50 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  nCkpt);.    sqli
12c60 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
12c70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
12c80 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
12c90 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  rc);..  /* If th
12ca0 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
12cb0 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c  e statements, cl
12cc0 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75 70  ear the interrup
12cd0 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20  t flag at this. 
12ce0 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20   ** point.  */. 
12cf0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
12d00 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  tive==0 ){.    d
12d10 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
12d20 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ted = 0;.  }..  
12d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12d40 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
12d60 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
12d70 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
12d80 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
12d90 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
12da0 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
12db0 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
12dc0 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
12dd0 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
12de0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
12df0 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
12e00 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
12e10 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
12e20 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
12e30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
12e40 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  {.  /* EVIDENCE-
12e50 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35  OF: R-41613-2055
12e60 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  3 The sqlite3_wa
12e70 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58  l_checkpoint(D,X
12e80 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ) is equivalent 
12e90 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
12ea0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
12eb0 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45  2(D,X,SQLITE_CHE
12ec0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
12ed0 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72  0,0). */.  retur
12ee0 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
12ef0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a  eckpoint_v2(db,z
12f00 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  Db,SQLITE_CHECKP
12f10 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
12f20 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
12f30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
12f40 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70  .** Run a checkp
12f50 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65  oint on database
12f60 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20   iDb. This is a 
12f70 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73  no-op if databas
12f80 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20  e iDb is.** not 
12f90 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69  currently open i
12fa0 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  n WAL mode..**.*
12fb0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
12fc0 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
12fd0 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
12fe0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74   checkpointed, t
12ff0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
13000 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
13010 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65  LOCKED and a che
13020 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61  ckpoint is not a
13030 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a  ttempted. If .**
13040 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13050 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74   while running t
13060 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61  he checkpoint, a
13070 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
13080 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
13090 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ned (i.e. SQLITE
130a0 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69  _IOERR). Otherwi
130b0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
130c0 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f  *.** The mutex o
130d0 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
130e0 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68  e db should be h
130f0 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eld by the calle
13100 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  r. The mutex.** 
13110 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13120 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74  the specific b-t
13130 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ree being checkp
13140 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20  ointed is taken 
13150 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
13160 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68  ion while the ch
13170 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e  eckpoint is runn
13180 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ing..**.** If iD
13190 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49  b is passed SQLI
131a0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
131b0 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68   then all attach
131c0 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
131d0 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
131e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  . If an error is
131f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
13200 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
13210 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20  diately -.** no 
13220 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
13230 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  to checkpoint an
13240 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61  y remaining data
13250 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  bases..**.** Par
13260 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20  ameter eMode is 
13270 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
13280 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
13290 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a  , FULL, RESTART.
132a0 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a  ** or TRUNCATE..
132b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
132c0 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
132d0 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
132e0 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
132f0 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
13300 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13310 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13320 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13330 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
13360 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
13370 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
13380 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
13390 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
133a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
133b0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
133c0 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
133d0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
133e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
133f0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
13400 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
13410 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
13420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
13430 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
13440 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
13450 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
13460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
13470 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
13480 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
13490 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
134a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
134b0 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
134c0 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
134d0 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
134e0 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
134f0 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
13500 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
13510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13520 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
13530 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
13540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13550 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
13560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13570 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
13580 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
13590 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
135a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
135b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
135c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
135d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
135e0 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
135f0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
13600 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
13610 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
13620 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
13630 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
13640 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
13650 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
13660 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
13670 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
13680 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
13690 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
136a0 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
136b0 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
136c0 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
136d0 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
136e0 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
136f0 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
13700 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
13710 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
13720 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
13730 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
13740 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
13750 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
13760 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
13770 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
13780 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
13790 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
137a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
137b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
137c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137e0 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
13820 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13850 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
13860 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13890 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
138a0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
138b0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
138c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
138d0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
138e0 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
138f0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13900 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
13910 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13920 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13930 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13940 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
13960 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
13970 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
139b0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
139e0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
139f0 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
13a00 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
13a10 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
13a20 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
13a30 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13a40 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
13a50 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
13a60 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
13a70 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13a80 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
13a90 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
13aa0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
13ab0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13ac0 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
13ad0 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
13ae0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
13af0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
13b00 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
13b10 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e  EMP_STORE>3.  UN
13b20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
13b30 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b);.  return 0;.
13b40 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13b50 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
13b60 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
13b70 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
13b80 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
13b90 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
13ba0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
13bb0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
13bc0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
13bd0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
13be0 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
13bf0 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
13c00 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  r(SQLITE_NOMEM_B
13c10 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  KPT);.  }.  if( 
13c20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
13c30 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
13c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
13c50 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
13c60 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
13c70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13c80 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
13c90 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
13ca0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13cb0 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
13cc0 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
13cd0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c  MEM_BKPT);.  }el
13ce0 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65  se{.    testcase
13cf0 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b  ( db->pErr==0 );
13d00 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65 72 72  .    z = db->err
13d10 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29 73 71  Code ? (char*)sq
13d20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13d30 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30 3b 0a  (db->pErr) : 0;.
13d40 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
13d50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13d60 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
13d70 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
13d80 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
13d90 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
13da0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13db0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
13dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
13dd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13de0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
13df0 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
13e00 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
13e10 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
13e20 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
13e30 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
13e40 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
13e50 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
13e60 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
13e70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13e80 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
13e90 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
13ea0 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
13eb0 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
13ec0 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
13ed0 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
13ee0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
13ef0 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
13f00 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27 2c    'b', 'a', 'd',
13f10 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c 20   ' ', 'p', 'a', 
13f20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27  'r', 'a', 'm', '
13f30 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27 72  e', 't', 'e', 'r
13f40 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c  ', ' ',.    'o',
13f50 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   'r', ' ', 'o', 
13f60 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20 27  't', 'h', 'e', '
13f70 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27 50  r', ' ', 'A', 'P
13f80 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20 20  ', 'I', ' ',.   
13f90 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c 20   'm', 'i', 's', 
13fa0 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20 30  'u', 's', 'e', 0
13fb0 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
13fc0 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
13fd0 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
13fe0 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
13ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
14000 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
14010 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
14020 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
14030 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
14040 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14050 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
14060 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14070 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
14080 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
14090 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
140a0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
140b0 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
140c0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
140d0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
140e0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
140f0 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
14100 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
14110 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
14120 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
14130 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
14140 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
14150 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
14160 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
14170 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
14180 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
14190 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
141a0 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
141b0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
141c0 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
141d0 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
141e0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
141f0 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
14200 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
14210 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
14220 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
14230 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
14240 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
14250 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
14260 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
14270 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
14280 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72   sqlite3OomClear
14290 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
142a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
142b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
142c0 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
142d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
142e0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
142f0 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
14300 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
14310 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
14320 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
14330 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
14340 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
14350 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
14360 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
14370 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
14380 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
14390 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
143a0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
143b0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
143c0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
143d0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
143e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
143f0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
14400 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
14410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14420 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
14450 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
14460 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
14470 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
14480 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
14490 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
144a0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
144b0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
144c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
144d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
144e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
144f0 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
14500 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
14510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14520 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
14530 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
14540 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
14550 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c  system_errno(sql
14560 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
14570 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79  urn db ? db->iSy
14580 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a  sErrno : 0;.}  .
14590 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
145a0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
145b0 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
145c0 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
145d0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
145e0 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
145f0 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
14600 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
14610 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
14620 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
14630 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
14640 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
14650 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
14660 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
14670 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14680 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
14690 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
146a0 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
146b0 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
146c0 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
146d0 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
146e0 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
146f0 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
14700 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
14710 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
14720 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
14730 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
14740 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
14750 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
14760 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
14770 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
14780 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
14790 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
147a0 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
147b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
147c0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
147d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
147e0 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
147f0 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
14800 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
14810 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
14820 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
14830 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
14840 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
14850 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
14860 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
14870 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
14880 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
14890 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
148a0 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
148b0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
148c0 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
148d0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
148e0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
148f0 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
14900 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
14910 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
14920 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
14930 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
14940 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
14950 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
14960 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
14970 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
14980 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
14990 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
149a0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
149b0 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
149c0 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
149d0 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
149e0 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
149f0 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
14a00 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
14a10 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
14a20 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
14a30 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
14a40 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
14a50 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
14a60 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
14a70 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
14a80 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
14a90 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
14aa0 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
14ab0 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
14ac0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
14ad0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
14ae0 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
14af0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
14b00 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
14b10 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
14b20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
14b30 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
14b40 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
14b50 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
14b60 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
14b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14b90 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
14ba0 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20  dStatements(db, 
14bb0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  0);..    /* If c
14bc0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14bd0 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
14be0 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
14bf0 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
14c00 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14c10 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
14c20 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
14c30 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
14c40 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
14c50 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
14c60 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
14c70 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
14c80 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
14c90 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
14ca0 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
14cb0 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
14cc0 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
14cd0 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
14ce0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
14cf0 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
14d00 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
14d10 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
14d20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
14d30 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
14d40 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
14d50 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  lSeq, zName);.  
14d60 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
14d70 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
14d80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
14d90 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
14da0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
14db0 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
14dc0 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
14dd0 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
14de0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
14df0 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
14e00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14e10 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
14e20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14e40 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14e50 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14e60 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
14e70 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
14e80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14e90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14ea0 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
14eb0 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
14ec0 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
14ed0 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
14ee0 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
14ef0 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
14f00 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
14f10 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
14f20 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
14f30 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f50 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
14f60 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
14f70 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
14f80 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
14f90 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
14fa0 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
14fb0 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
14fc0 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
14fd0 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
14fe0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
14ff0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
15000 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
15010 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
15020 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
15030 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
15040 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
15050 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
15060 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
15070 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
15080 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
15090 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
150a0 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
150b0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
150c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
150d0 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
150e0 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
150f0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
15100 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
15110 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
15120 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
15130 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
15140 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
15150 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
15160 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
15170 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
15180 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
15190 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
151a0 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
151b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
151c0 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
151d0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
151e0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
151f0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
15200 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15210 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
15220 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15230 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
15240 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
15250 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
15260 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
15270 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
15280 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
15290 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
152a0 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
152b0 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
152c0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
152d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
152e0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
152f0 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
15300 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
15310 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
15320 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
15330 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15340 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
15350 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15360 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
15370 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
15380 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15390 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
153a0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
153b0 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a  UNCTION_ARG>127.
153c0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
153d0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
153e0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
153f0 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69 66  0 and 127.#endif
15400 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15410 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
15420 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15430 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51  D>125.# error SQ
15440 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15450 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
15460 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64  n 0 and 125.#end
15470 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15480 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
15490 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
154a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
154b0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
154c0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
154d0 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
154e0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
154f0 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
15500 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
15510 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
15520 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
15530 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
15540 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
15550 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
15560 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
15570 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
15580 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15590 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
155a0 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ADS<0 || SQLITE_
155b0 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
155c0 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51  DS>50.# error SQ
155d0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
155e0 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65 20  THREADS must be 
155f0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30  between 0 and 50
15600 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
15610 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
15620 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65   of a limit.  Re
15630 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
15640 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76  ue..** If an inv
15650 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78  alid limit index
15660 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65   is supplied, re
15670 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65  port -1..** Make
15680 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20   no changes but 
15690 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65  still report the
156a0 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68   old value if th
156b0 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69  e.** new limit i
156c0 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  s negative..**.*
156d0 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69  * A new lower li
156e0 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72  mit does not shr
156f0 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  ink existing con
15700 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d  structs..** It m
15710 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e  erely prevents n
15720 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68  ew constructs th
15730 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69  at exceed the li
15740 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d  mit.** from form
15750 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
15760 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65  te3_limit(sqlite
15770 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74  3 *db, int limit
15780 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74  Id, int newLimit
15790 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69  ){.  int oldLimi
157a0 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
157b0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
157c0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
157d0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
157e0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
157f0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
15800 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
15810 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
15820 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
15830 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46   R-30189-54097 F
15840 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61  or each limit ca
15850 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49  tegory SQLITE_LI
15860 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68  MIT_NAME.  ** th
15870 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70  ere is a hard up
15880 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74  per bound set at
15890 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79   compile-time by
158a0 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f   a C preprocesso
158b0 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c  r.  ** macro cal
158c0 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e  led SQLITE_MAX_N
158d0 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49  AME. (The "_LIMI
158e0 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  T_" in the name 
158f0 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20  is changed to.  
15900 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a  ** "_MAX_".).  *
15910 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  /.  assert( aHar
15920 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15930 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  MIT_LENGTH]==SQL
15940 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
15950 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15960 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15970 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d  MIT_SQL_LENGTH]=
15980 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f  =SQLITE_MAX_SQL_
15990 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
159a0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
159b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
159c0 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  MN]==SQLITE_MAX_
159d0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
159e0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
159f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
15a00 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
15a10 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
15a20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15a30 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15a40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15a50 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ECT]==SQLITE_MAX
15a60 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15a80 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15a90 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53  IMIT_VDBE_OP]==S
15aa0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
15ab0 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  P );.  assert( a
15ac0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15ad0 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
15ae0 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ARG]==SQLITE_MAX
15af0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b  _FUNCTION_ARG );
15b00 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15b10 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15b20 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51  IT_ATTACHED]==SQ
15b30 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15b40 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
15b50 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15b60 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
15b70 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20  ERN_LENGTH]==.  
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15bb0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
15bc0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  TERN_LENGTH );. 
15bd0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15be0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15bf0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
15c00 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ]==SQLITE_MAX_VA
15c10 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
15c20 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15c30 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15c40 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
15c50 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  ==SQLITE_MAX_TRI
15c60 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  GGER_DEPTH );.  
15c70 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
15c80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
15c90 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d  WORKER_THREADS]=
15ca0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  =SQLITE_MAX_WORK
15cb0 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20  ER_THREADS );.  
15cc0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c  assert( SQLITE_L
15cd0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
15ce0 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  ADS==(SQLITE_N_L
15cf0 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
15d00 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
15d10 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
15d20 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
15d30 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15d40 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
15d50 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
15d60 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
15d70 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
15d80 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
15d90 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
15da0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
15db0 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
15dc0 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
15dd0 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
15de0 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
15df0 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
15e00 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
15e10 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
15e20 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
15e30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
15e40 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
15e70 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
15e80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15e90 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
15ea0 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
15eb0 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
15ec0 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
15ed0 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
15ee0 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
15ef0 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
15f00 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
15f10 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
15f20 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
15f30 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
15f40 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
15f50 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
15f60 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15f70 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
15f80 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
15f90 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
15fa0 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
15fb0 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
15fc0 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
15fd0 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
15fe0 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
15ff0 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
16000 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
16010 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
16020 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
16030 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
16040 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
16050 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
16060 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
16070 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
16080 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
16090 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
160a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
160b0 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
160c0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
160d0 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
160e0 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
160f0 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
16100 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
16110 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
16120 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
16130 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16140 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
16150 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
16160 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
16170 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
16180 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
16190 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
161a0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
161b0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
161c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
161d0 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
161e0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
161f0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
16200 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
16210 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
16220 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
16230 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16240 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
16250 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
16260 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
16270 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
16280 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
16290 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
162a0 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
162b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
162c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
162d0 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
162e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
162f0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
16300 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
16310 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
16320 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
16330 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
16340 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
16350 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
16360 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
16370 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
16380 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
16390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
163a0 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
163b0 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
163c0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
163d0 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
163e0 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
163f0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
16400 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
16410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16420 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
16430 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
16440 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
16450 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
16460 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
16470 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
16480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
16490 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
164a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
164b0 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
164c0 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164e0 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
164f0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
16500 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
16510 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
16520 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
16530 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
16540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
16550 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
16570 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
16580 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
16590 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
165a0 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
165b0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
165c0 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
165d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
165e0 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
165f0 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
16600 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
16610 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16620 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20 20  N_URI)          
16630 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37     /* IMP: R-487
16640 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20  25-32206 */.    
16650 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
16660 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
16670 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a  OpenUri) /* IMP:
16680 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a   R-51689-46548 *
16690 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20  /.   && nUri>=5 
166a0 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
166b0 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f  "file:", 5)==0 /
166c0 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33  * IMP: R-57884-3
166d0 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  7496 */.  ){.   
166e0 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
166f0 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16710 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
16720 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
16730 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
16760 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
16770 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
16780 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16790 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
167a0 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
167b0 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20      u64 nByte = 
167c0 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
167d0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
167e0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
167f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
16800 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
16810 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
16820 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
16830 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
16840 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
16850 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
16860 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
16870 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
16880 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
16890 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
168a0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
168b0 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
168c0 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
168d0 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
168e0 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
168f0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
16900 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
16910 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
16920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16930 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  OMEM_BKPT;..    
16940 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20  iIn = 5;.#ifdef 
16950 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49  SQLITE_ALLOW_URI
16960 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69  _AUTHORITY.    i
16970 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
16980 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  5, "///", 3)==0 
16990 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
169a0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
169b0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
169c0 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77  on causes URIs w
169d0 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67  ith five leading
169e0 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
169f0 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65      ** like file
16a00 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ://///host/path 
16a10 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
16a20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f  into UNCs like /
16a30 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20  /host/path..    
16a40 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74    ** The correct
16a50 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e   URI for that UN
16a60 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f  C has only two o
16a70 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f  r four leading /
16a80 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
16a90 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74    ** file://host
16aa0 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f  /path or file://
16ab0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75  //host/path.  Bu
16ac0 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73  t 5 leading slas
16ad0 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20  hes is a .      
16ae0 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c  ** common error,
16af0 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f   we are told, so
16b00 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73   we handle it as
16b10 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e   a special case.
16b20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
16b30 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f  rncmp(zUri+7, "/
16b40 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49  //", 3)==0 ){ iI
16b50 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  n++; }.    }else
16b60 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
16b70 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73  i+5, "//localhos
16b80 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20  t/", 12)==0 ){. 
16b90 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20       iIn = 16;. 
16ba0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
16bb0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
16bc0 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
16bd0 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
16be0 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
16bf0 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
16c00 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
16c10 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
16c20 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
16c30 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
16c40 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
16c50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49  ++;.      if( iI
16c60 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
16c70 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
16c80 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
16c90 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
16ca0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
16cb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
16cc0 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
16cd0 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
16ce0 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
16cf0 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
16d00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16d10 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
16d20 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
16d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16d40 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
16d50 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
16d60 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
16d70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
16d80 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
16d90 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
16da0 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
16db0 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
16dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
16dd0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
16de0 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
16df0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
16e00 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
16e10 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
16e20 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
16e30 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
16e40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
16e50 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
16e60 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
16e70 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
16e80 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
16e90 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
16ea0 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
16eb0 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
16ec0 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
16ed0 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
16ee0 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
16ef0 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
16f00 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
16f10 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
16f20 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
16f30 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
16f40 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
16f50 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
16f60 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
16f70 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
16f80 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
16f90 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
16fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
16fb0 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
16fc0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
16fd0 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
16fe0 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
16ff0 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
17000 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
17010 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
17020 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
17030 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17040 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  octet==0 ){.#ifn
17050 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17060 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20  E_URI_00_ERROR. 
17070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
17080 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
17090 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
170a0 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
170b0 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
170c0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
170d0 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
170e0 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
170f0 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
17100 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
17110 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
17120 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
17130 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
17140 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
17150 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
17160 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
17170 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
17180 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
17190 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
171a0 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
171b0 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
171c0 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
171d0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
171e0 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
171f0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
17200 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
17210 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
17220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
17230 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
17240 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
17250 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
17260 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
17270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
17280 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20  ntinue;.#else.  
17290 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45 4e          /* If EN
172a0 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
172b0 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22 25  R is defined, "%
172c0 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73 20  00" in a URI is 
172d0 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  an error. */.   
172e0 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
172f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17300 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20 25  tf("unexpected %
17310 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20 20  %00 in uri");.  
17320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17330 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
17340 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
17350 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a  uri_out;.#endif.
17360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17370 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
17380 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
17390 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
173a0 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
173b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
173c0 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
173d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
173e0 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
173f0 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
17400 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
17410 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
17420 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
17430 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
17440 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
17450 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
17460 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
17470 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
17480 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
17490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
174a0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
174b0 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
174c0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
174d0 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
174e0 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
174f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17500 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
17510 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
17520 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
17530 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
17540 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
17550 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17560 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
17570 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
17580 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
17590 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
175a0 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
175b0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
175c0 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
175d0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
175e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
175f0 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
17600 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
17610 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
17620 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
17630 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
17640 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
17650 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
17660 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
17670 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
17680 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
17690 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
176a0 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
176b0 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
176c0 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
176d0 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
176e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
176f0 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
17700 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
17710 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
17720 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17730 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
17740 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
17750 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
17760 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
17770 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
17780 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
17790 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
177a0 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
177b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
177c0 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
177d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
177e0 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
177f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
17800 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
17810 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
17820 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
17830 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
17840 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
17850 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
17860 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
17870 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
17880 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
17890 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
178a0 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
178b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
178c0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
178d0 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
178e0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
178f0 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
17900 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
17910 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
17920 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
17930 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
17940 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
17960 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
17970 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
17980 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
17990 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
179a0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
179b0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
179c0 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
179d0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
179e0 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
179f0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
17a00 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
17a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17a20 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
17a30 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
17a40 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
17a50 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
17a60 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
17a70 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
17a80 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
17a90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17aa0 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
17ab0 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
17ac0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17ad0 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
17ae0 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
17af0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
17b00 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17b10 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
17b20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
17b30 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
17b40 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
17b50 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
17b60 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
17b70 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
17b80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17b90 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
17ba0 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17bd0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
17be0 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
17bf0 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
17c00 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
17c10 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
17c20 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
17c30 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
17c40 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
17c50 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
17c60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
17c70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
17c80 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
17c90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17ca0 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
17cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
17cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
17cd0 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
17ce0 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
17cf0 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
17d00 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
17d10 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
17d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17d30 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
17d40 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
17d50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17d80 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
17d90 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
17da0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
17db0 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
17dc0 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
17dd0 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
17de0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17df0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17e00 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
17e10 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
17e20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e30 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
17e40 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
17e50 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
17e60 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
17e70 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
17e80 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
17e90 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
17ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17ed0 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
17ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17ef0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
17f00 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
17f10 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
17f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17f30 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
17f40 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
17f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17f60 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
17f70 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
17f80 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
17f90 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
17fa0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69  e3_malloc64(nUri
17fb0 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  +2);.    if( !zF
17fc0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
17fd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
17fe0 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b 0a      if( nUri ){.
17ff0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69        memcpy(zFi
18000 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
18010 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
18020 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nUri] = '\0';. 
18030 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d     zFile[nUri+1]
18040 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61   = '\0';.    fla
18050 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
18060 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a  EN_URI;.  }..  *
18070 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ppVfs = sqlite3_
18080 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
18090 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20    if( *ppVfs==0 
180a0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
180b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
180c0 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  tf("no such vfs:
180d0 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
180e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
180f0 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75  OR;.  }. parse_u
18100 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  ri_out:.  if( rc
18110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18120 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18130 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c  zFile);.    zFil
18140 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46  e = 0;.  }.  *pF
18150 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
18160 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  *pzFile = zFile;
18170 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18180 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18190 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f  ITE_HAS_CODEC)./
181a0 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 55 52 49  *.** Process URI
181b0 20 66 69 6c 65 6e 61 6d 65 20 71 75 65 72 79 20   filename query 
181c0 70 61 72 61 6d 65 74 65 72 73 20 72 65 6c 65 76  parameters relev
181d0 61 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ant to the SQLit
181e0 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a 2a 2a 20  e Encryption.** 
181f0 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52 65 74 75  Extension.  Retu
18200 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 6f  rn true if any o
18210 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 71  f the relevant q
18220 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
18230 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61 6e 64 20  are.** seen and 
18240 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  return false if 
18250 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
18260 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61 72  te3CodecQueryPar
18270 61 6d 65 74 65 72 73 28 0a 20 20 73 71 6c 69 74  ameters(.  sqlit
18280 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
18290 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
182a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
182b0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
182c0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 63       /* Which sc
182d0 68 65 6d 61 20 69 73 20 62 65 69 6e 67 20 63 72  hema is being cr
182e0 65 61 74 65 64 2f 61 74 74 61 63 68 65 64 20 2a  eated/attached *
182f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18300 7a 55 72 69 20 20 20 20 20 20 20 2f 2a 20 55 52  zUri       /* UR
18310 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29 7b  I filename */.){
18320 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18330 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a 4b 65 79  Key;.  if( (zKey
18340 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
18350 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22  arameter(zUri, "
18360 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26 26 20  hexkey"))!=0 && 
18370 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 75  zKey[0] ){.    u
18380 38 20 69 42 79 74 65 3b 0a 20 20 20 20 69 6e 74  8 iByte;.    int
18390 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44 65   i;.    char zDe
183a0 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 66  coded[40];.    f
183b0 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
183c0 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
183d0 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
183e0 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
183f0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
18400 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
18410 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
18420 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20  Int(zKey[i]);.  
18430 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30      if( (i&1)!=0
18440 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d   ) zDecoded[i/2]
18450 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = iByte;.    }.
18460 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
18470 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 44 65 63  v2(db, zDb, zDec
18480 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20 20  oded, i/2);.    
18490 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
184a0 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
184b0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
184c0 74 65 72 28 7a 55 72 69 2c 20 22 6b 65 79 22 29  ter(zUri, "key")
184d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
184e0 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
184f0 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65  Db, zKey, sqlite
18500 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29  3Strlen30(zKey))
18510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
18520 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65    }else if( (zKe
18530 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
18540 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20  parameter(zUri, 
18550 22 74 65 78 74 6b 65 79 22 29 29 21 3d 30 20 29  "textkey"))!=0 )
18560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65  {.    sqlite3_ke
18570 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
18580 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ey, -1);.    ret
18590 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
185a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
185b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
185c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
185d0 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
185e0 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
185f0 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
18600 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
18610 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
18620 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
18630 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
18640 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
18650 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
18660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18670 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
18680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
18690 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
186a0 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
186b0 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
186c0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
186d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
186e0 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
186f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
18700 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
18710 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
18720 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
18730 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
18740 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18750 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
18760 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
18770 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
18780 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
18790 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
187a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
187b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
187c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
187d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
187e0 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18800 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
18810 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
18820 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
18830 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
18840 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
18850 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
18860 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
18870 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
18880 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
18890 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
188a0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
188b0 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
188c0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
188d0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
188e0 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
188f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18900 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
18910 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
18920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18930 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
18940 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
18950 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
18960 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18970 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
18980 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18990 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
189a0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
189b0 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
189c0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
189d0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
189e0 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
189f0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
18a00 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
18a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
18a20 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
18a30 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
18a40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
18a50 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
18a60 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
18a70 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a 20  ullMutex;.  }.. 
18a80 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
18a90 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
18aa0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
18ab0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
18ac0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
18ad0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
18ae0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18af0 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
18b00 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
18b10 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
18b20 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
18b30 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
18b40 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
18b50 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
18b60 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
18b70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
18b80 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
18b90 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
18ba0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
18bb0 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
18bc0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
18bd0 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
18be0 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
18bf0 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
18c00 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
18c10 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
18c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18c30 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
18c40 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18c50 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
18c60 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
18c70 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
18c80 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
18c90 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
18ca0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
18cb0 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
18cc0 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
18cd0 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
18ce0 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
18cf0 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
18d00 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18d20 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
18d30 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
18d40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18d50 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
18d60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18d70 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
18d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
18da0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
18db0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18dc0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18dd0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
18de0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18df0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
18e00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18e10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
18e20 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
18e30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18e40 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18e50 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
18e60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18e70 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
18e80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18e90 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
18ea0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18eb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
18ec0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
18ed0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
18ee0 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
18ef0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
18f00 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
18f10 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
18f20 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
18f30 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
18f40 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
18f50 69 73 54 68 72 65 61 64 73 61 66 65 20 0a 23 69  isThreadsafe .#i
18f60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18f70 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45 44  LE_MULTITHREADED
18f80 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73 71  _CHECKS.   || sq
18f90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18fa0 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65 6e  g.bCoreMutex.#en
18fb0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62 2d  dif.  ){.    db-
18fc0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
18fd0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
18fe0 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
18ff0 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
19000 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
19010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
19020 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
19030 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
19040 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
19050 20 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73     if( isThreads
19060 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  afe==0 ){.      
19070 73 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72 6e  sqlite3MutexWarn
19080 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62 2d  OnContention(db-
19090 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
190a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
190b0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
190c0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
190d0 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
190e0 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
190f0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
19100 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
19110 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
19120 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  atic;.  db->look
19130 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d  aside.bDisable =
19140 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   1;..  assert( s
19150 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
19160 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
19170 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
19180 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
19190 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
191a0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
191b0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
191c0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
191d0 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
191e0 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
191f0 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
19200 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
19210 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
19220 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
19230 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
19240 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
19250 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
19260 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
19270 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
19280 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
19290 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
192a0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
192b0 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
192c0 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
192d0 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
192e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
192f0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
19300 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
19310 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
19320 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
19340 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
19350 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
19360 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55  E_DEFAULT_CKPTFU
19370 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20  LLFSYNC.        
19380 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
19390 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a  E_CkptFullFSync.
193a0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
193b0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
193c0 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
193d0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
193e0 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
193f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
19400 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
19410 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
19420 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19430 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
19440 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
19450 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
19460 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
19490 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
194a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
194b0 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
194c0 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
194d0 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
194e0 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
194f0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
19500 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
19510 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
19520 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f  LITE_REVERSE_UNO
19530 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a  RDERED_SELECTS).
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
19560 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69  eOrder.#endif.#i
19570 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19580 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
19590 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
195b0 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
195c0 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  k.#endif.#if def
195d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
195e0 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
195f0 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R).             
19600 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73      | SQLITE_Fts
19610 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69  3Tokenizer.#endi
19620 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
19630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53 47  LITE_ENABLE_QPSG
19640 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
19650 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62     | SQLITE_Enab
19660 6c 65 51 50 53 47 0a 23 65 6e 64 69 66 0a 23 69  leQPSG.#endif.#i
19670 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19680 5f 44 45 46 41 55 4c 54 5f 44 45 46 45 4e 53 49  _DEFAULT_DEFENSI
19690 56 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  VE).            
196a0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 65       | SQLITE_De
196b0 66 65 6e 73 69 76 65 0a 23 65 6e 64 69 66 0a 20  fensive.#endif. 
196c0 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
196d0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
196e0 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
196f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19700 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
19710 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
19720 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
19730 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
19740 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
19750 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
19760 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
19770 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
19780 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
19790 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
197a0 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
197b0 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
197c0 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
197d0 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
197e0 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
197f0 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
19800 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
19810 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43   **.  ** EVIDENC
19820 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34  E-OF: R-52786-44
19830 38 37 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e  878 SQLite defin
19840 65 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69  es three built-i
19850 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a  n collating.  **
19860 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f   functions:.  */
19870 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
19880 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
19890 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
198a0 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
198b0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
198c0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
198d0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
198e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
198f0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
19900 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
19910 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
19920 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
19930 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
19940 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
19950 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
19960 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
19970 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
19980 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
19990 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  gFunc, 0);.  cre
199a0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
199b0 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
199c0 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
199d0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
199e0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
199f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19a00 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19a10 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e  .  }.  /* EVIDEN
19a20 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31  CE-OF: R-08308-1
19a30 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74  7224 The default
19a40 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
19a50 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a  ion for all.  **
19a60 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41   strings is BINA
19a70 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  RY. .  */.  db->
19a80 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
19a90 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
19aa0 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
19ab0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
19ac0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
19ad0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30  db->pDfltColl!=0
19ae0 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20   );..  /* Parse 
19af0 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
19b00 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a 20   argument.  **. 
19b10 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   ** Only allow s
19b20 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
19b30 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
19b40 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
19b50 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
19b60 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
19b70 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
19b80 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
19b90 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
19ba0 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
19bb0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
19bc0 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
19bd0 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
19be0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
19bf0 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
19c00 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
19c10 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
19c20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
19c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19c40 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
19c50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19c60 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
19c70 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19c80 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
19c90 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
19ca0 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d   db->openFlags =
19cb0 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74   flags;.  assert
19cc0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
19cd0 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
19ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
19cf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19d00 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
19d10 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
19d20 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
19d30 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
19d40 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
19d50 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
19d60 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
19d70 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
19d80 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
19d90 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
19da0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
19db0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
19dc0 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
19dd0 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
19de0 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
19df0 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
19e00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19e10 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f  _MISUSE_BKPT;  /
19e20 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34  * IMP: R-65497-4
19e30 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  4594 */.  }else{
19e40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19e50 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20  3ParseUri(zVfs, 
19e60 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67  zFilename, &flag
19e70 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a  s, &db->pVfs, &z
19e80 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Open, &zErrMsg);
19e90 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
19ec0 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f  OMEM ) sqlite3Oo
19ed0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
19ee0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
19ef0 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  Msg(db, rc, zErr
19f00 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
19f10 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
19f20 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
19f30 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
19f40 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
19f50 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
19f60 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
19f70 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
19f80 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
19f90 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
19fa0 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
19fb0 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
19fe0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
19ff0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a000 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
1a010 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
1a020 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
1a030 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1a040 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1a050 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
1a060 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
1a070 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
1a080 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a090 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
1a0a0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
1a0b0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
1a0c0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
1a0d0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
1a0e0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1a0f0 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
1a100 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
1a110 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
1a120 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
1a130 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
1a140 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
1a150 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
1a160 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
1a170 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
1a180 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
1a190 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
1a1a0 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20  s FULL; for the 
1a1b0 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
1a1c0 73 65 20 69 74 20 69 73 20 4f 46 46 2e 20 54 68  se it is OFF. Th
1a1d0 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
1a1e0 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
1a1f0 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
1a200 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[0].zDbSNam
1a210 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
1a220 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
1a230 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
1a240 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
1a250 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  US+1;.  db->aDb[
1a260 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74  1].zDbSName = "t
1a270 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
1a280 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
1a290 3d 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  = PAGER_SYNCHRON
1a2a0 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e  OUS_OFF;..  db->
1a2b0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1a2c0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
1a2d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a2e0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
1a2f0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
1a300 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
1a310 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
1a320 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
1a330 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
1a340 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1a350 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
1a360 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
1a370 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
1a380 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
1a390 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
1a3a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a3b0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
1a3c0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
1a3d0 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63  egisterPerConnec
1a3e0 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74  tionBuiltinFunct
1a3f0 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d  ions(db);.  rc =
1a400 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a410 28 64 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  (db);..#ifdef SQ
1a420 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35  LITE_ENABLE_FTS5
1a430 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
1a440 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46 54 53 35  ny built-in FTS5
1a450 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65 20 6c   module before l
1a460 6f 61 64 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  oading the autom
1a470 61 74 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73  atic.  ** extens
1a480 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ions. This allow
1a490 73 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  s automatic exte
1a4a0 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67 69 73 74  nsions to regist
1a4b0 65 72 20 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f  er FTS5 .  ** to
1a4c0 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78  kenizers and aux
1a4d0 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73  iliary functions
1a4e0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
1a4f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a510 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a520 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a  e3Fts5Init(db);.
1a530 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a540 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20   Load automatic 
1a550 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74  extensions - ext
1a560 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
1a570 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  e been registere
1a580 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  d.  ** using the
1a590 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74   sqlite3_automat
1a5a0 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41  ic_extension() A
1a5b0 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  PI..  */.  if( r
1a5c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a5d0 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
1a5e0 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
1a5f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1a600 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1a610 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a630 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
1a640 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1a650 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a660 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
1a670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1a680 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1a690 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
1a6a0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
1a6b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
1a6c0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a6d0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a6e0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
1a6f0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a700 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1a710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
1a720 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1a730 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
1a740 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
1a750 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
1a760 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a780 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f  BLE_FTS3 /* auto
1a790 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65  matically define
1a7a0 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42  d by SQLITE_ENAB
1a7b0 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28  LE_FTS4 */.  if(
1a7c0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a7d0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1a7e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a7f0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
1a800 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1a810 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a820 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 29 20  ITE_ENABLE_ICU) 
1a830 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1a840 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f 43 4f 4c  E_ENABLE_ICU_COL
1a850 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66 28 20 21  LATIONS).  if( !
1a860 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a870 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a880 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a890 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
1a8a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a8b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a8c0 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
1a8d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a8e0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a8f0 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1a900 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
1a910 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a930 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 0a  BLE_DBPAGE_VTAB.
1a940 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a950 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a960 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a970 63 20 3d 20 73 71 6c 69 74 65 33 44 62 70 61 67  c = sqlite3Dbpag
1a980 65 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  eRegister(db);. 
1a990 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1a9a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a9b0 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66  DBSTAT_VTAB.  if
1a9c0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a9d0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a9e0 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
1a9f0 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
1aa00 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23  ister(db);.  }.#
1aa10 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1aa20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  LITE_ENABLE_JSON
1aa30 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
1aa40 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1aa50 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1aa60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f   rc = sqlite3Jso
1aa70 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  n1Init(db);.  }.
1aa80 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1aa90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
1aaa0 54 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  TVTAB.  if( !db-
1aab0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1aac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1aad0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1aae0 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 64 62  3StmtVtabInit(db
1aaf0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1ab00 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
1ab10 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1ab20 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
1ab30 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
1ab40 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
1ab50 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
1ab60 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1ab70 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
1ab80 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
1ab90 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
1aba0 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
1abb0 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
1abc0 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
1abd0 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
1abe0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
1abf0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
1ac00 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
1ac10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1ac20 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
1ac30 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
1ac40 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
1ac50 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
1ac60 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
1ac90 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
1aca0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
1acb0 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72   rc ) sqlite3Err
1acc0 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f  or(db, rc);..  /
1acd0 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f  * Enable the loo
1ace0 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75  kaside-malloc su
1acf0 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74  bsystem */.  set
1ad00 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
1ad10 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  0, sqlite3Global
1ad20 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
1ad30 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ad50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ad60 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20  nLookaside);..  
1ad70 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
1ad80 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53  checkpoint(db, S
1ad90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
1ada0 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  L_AUTOCHECKPOINT
1adb0 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a  );..opendb_out:.
1adc0 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
1add0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
1ade0 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
1adf0 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  safe==0.        
1ae00 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
1ae10 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
1ae20 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
1ae30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ae40 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1ae50 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1ae60 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
1ae70 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
1ae80 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
1ae90 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
1aea0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1aeb0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1aec0 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
1aed0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
1aee0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1aef0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1af00 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
1af10 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
1af20 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
1af30 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
1af40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
1af50 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
1af60 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  og ){.    /* Ope
1af70 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65  ning a db handle
1af80 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
1af90 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20  er is passed 0. 
1afa0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  */.    void *pAr
1afb0 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  g = sqlite3Globa
1afc0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
1afd0 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  rg;.    sqlite3G
1afe0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
1aff0 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46  log(pArg, db, zF
1b000 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ilename, 0);.  }
1b010 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
1b020 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
1b030 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d  ODEC).  if( rc==
1b040 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69  SQLITE_OK ) sqli
1b050 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61 72  te3CodecQueryPar
1b060 61 6d 65 74 65 72 73 28 64 62 2c 20 30 2c 20 7a  ameters(db, 0, z
1b070 4f 70 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Open);.#endif.  
1b080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
1b090 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
1b0a0 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a   & 0xff;.}.../*.
1b0b0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
1b0c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
1b0d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
1b0e0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
1b0f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
1b100 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
1b110 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
1b120 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1b130 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1b160 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
1b170 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
1b180 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
1b190 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
1b1a0 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
1b1b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1b1c0 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
1b1d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
1b1e0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
1b1f0 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
1b200 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
1b210 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1b220 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
1b230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
1b240 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b250 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
1b260 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
1b270 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
1b280 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
1b290 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c  (unsigned int)fl
1b2a0 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23  ags, zVfs);.}..#
1b2b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b2c0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f  IT_UTF16./*.** O
1b2d0 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
1b2e0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
1b2f0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  t sqlite3_open16
1b300 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
1b310 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
1b320 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a  lite3 **ppDb.){.
1b330 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
1b340 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a  ilename8;   /* z
1b350 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64  Filename encoded
1b360 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61   in UTF-8 instea
1b370 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20  d of UTF-16 */. 
1b380 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1b390 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
1b3a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b3b0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1b3c0 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20    if( ppDb==0 ) 
1b3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b3e0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1b3f0 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  f.  *ppDb = 0;.#
1b400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b410 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
1b420 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
1b430 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
1b440 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
1b450 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c  endif.  if( zFil
1b460 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65  ename==0 ) zFile
1b470 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30  name = "\000\000
1b480 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  ";.  pVal = sqli
1b490 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
1b4a0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
1b4b0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
1b4c0 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
1b4d0 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
1b4e0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b4f0 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
1b500 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
1b510 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
1b520 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
1b530 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
1b540 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
1b550 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b580 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1b590 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1b5a0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1b5b0 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
1b5c0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
1b5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b5e0 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
1b5f0 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
1b600 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
1b610 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f  ){.      SCHEMA_
1b620 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43  ENC(*ppDb) = ENC
1b630 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45  (*ppDb) = SQLITE
1b640 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
1b650 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1b660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b670 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  EM_BKPT;.  }.  s
1b680 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
1b690 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
1b6a0 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65   rc & 0xff;.}.#e
1b6b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b6c0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
1b6d0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1b6e0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1b6f0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1b700 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1b710 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1b720 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1b730 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
1b740 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
1b750 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
1b760 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
1b770 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
1b780 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
1b790 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
1b7a0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
1b7b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1b7c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1b7d0 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65  _v2(db, zName, e
1b7e0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
1b7f0 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  re, 0);.}../*.**
1b800 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1b810 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b820 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1b830 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1b840 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1b850 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
1b860 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
1b870 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
1b880 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
1b890 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
1b8a0 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
1b8b0 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
1b8c0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
1b8d0 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
1b8e0 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
1b8f0 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ).){.  int rc;..
1b900 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b910 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b920 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b930 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
1b940 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
1b950 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1b960 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1b970 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b980 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1b990 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
1b9a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1b9b0 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
1b9c0 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
1b9d0 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
1b9e0 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29   xCompare, xDel)
1b9f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ba00 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1ba10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ba20 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1ba30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ba40 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ba50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1ba60 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1ba70 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1ba80 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1ba90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1baa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bab0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1bac0 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  n16(.  sqlite3* 
1bad0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  db, .  const voi
1bae0 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  d *zName,.  int 
1baf0 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
1bb00 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
1bb10 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
1bb20 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
1bb30 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
1bb40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1bb50 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
1bb60 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  me8;..#ifdef SQL
1bb70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1bb80 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1bb90 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1bba0 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
1bbb0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1bbc0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1bbd0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1bbe0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1bbf0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
1bc00 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1bc10 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
1bc20 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
1bc30 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  (db, zName, -1, 
1bc40 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
1bc50 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  VE);.  if( zName
1bc60 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
1bc70 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
1bc80 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e  , zName8, (u8)en
1bc90 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
1bca0 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
1bcb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1bcc0 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
1bcd0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
1bce0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
1bcf0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1bd00 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1bd10 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1bd20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1bd30 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
1bd40 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
1bd50 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1bd60 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
1bd70 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1bd80 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
1bd90 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
1bda0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
1bdb0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bdc0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
1bdd0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
1bde0 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
1bdf0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
1be00 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
1be10 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
1be20 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
1be30 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
1be40 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
1be50 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  r*).){.#ifdef SQ
1be60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1be70 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1be80 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1be90 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1bea0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1beb0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1bec0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1bed0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
1bee0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
1bef0 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
1bf00 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
1bf10 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
1bf20 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
1bf30 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
1bf40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bf50 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1bf60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bf70 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1bf80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1bf90 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1bfa0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1bfb0 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
1bfc0 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
1bfd0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
1bfe0 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
1bff0 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
1c000 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
1c010 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
1c020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c030 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
1c040 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
1c050 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
1c060 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
1c070 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
1c080 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
1c090 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
1c0a0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
1c0b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1c0c0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1c0d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1c0e0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1c0f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c100 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1c110 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1c120 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1c130 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
1c140 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
1c150 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
1c160 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
1c170 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
1c180 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
1c190 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
1c1a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1c1b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1c1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c1d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c1e0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1c1f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c200 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1c210 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c220 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
1c230 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
1c240 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
1c250 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
1c260 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
1c270 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
1c280 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
1c290 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
1c2a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
1c2b0 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29  al_recover(void)
1c2c0 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
1c2d0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1c2e0 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
1c2f0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
1c300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1c310 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61  nnection is in a
1c320 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64  utocommit.** mod
1c330 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
1c340 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c  if it is and FAL
1c350 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f  SE if not.  Auto
1c360 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f  commit mode is o
1c370 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e  n.** by default.
1c380 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20    Autocommit is 
1c390 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45  disabled by a BE
1c3a0 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  GIN statement an
1c3b0 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62  d reenabled.** b
1c3c0 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49  y the next COMMI
1c3d0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  T or ROLLBACK..*
1c3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  /.int sqlite3_ge
1c3f0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c  t_autocommit(sql
1c400 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
1c410 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c420 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1c430 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1c440 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1c450 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1c460 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1c470 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
1c480 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
1c490 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
1c4a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1c4b0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
1c4c0 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72   substitutes for
1c4d0 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
1c4e0 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
1c4f0 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
1c500 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
1c510 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70  LITE_NOMEM and p
1c520 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
1c530 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
1c540 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77  .  They serve tw
1c550 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
1c560 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
1c570 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
1c580 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
1c590 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
1c5a0 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
1c5b0 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
1c5c0 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
1c5d0 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
1c5e0 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
1c5f0 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
1c600 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
1c610 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
1c620 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
1c630 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
1c640 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
1c650 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
1c660 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1c670 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20  r(int iErr, int 
1c680 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68  lineno, const ch
1c690 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71  ar *zType){.  sq
1c6a0 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20  lite3_log(iErr, 
1c6b0 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  "%s at line %d o
1c6c0 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
1c6d0 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c            zType,
1c6e0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
1c6f0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
1c700 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a  .  return iErr;.
1c710 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  }.int sqlite3Cor
1c720 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69  ruptError(int li
1c730 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1c740 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1c750 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1c760 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1c770 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1c780 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1c790 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20  neno, "database 
1c7a0 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a  corruption");.}.
1c7b0 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73  int sqlite3Misus
1c7c0 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  eError(int linen
1c7d0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c7e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c7f0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c800 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c810 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c820 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f  E_MISUSE, lineno
1c830 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69  , "misuse");.}.i
1c840 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
1c850 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
1c860 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1c870 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c880 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1c890 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c8a0 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1c8b0 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e  TE_CANTOPEN, lin
1c8c0 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  eno, "cannot ope
1c8d0 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64  n file");.}.#ifd
1c8e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c8f0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1c900 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20  ptPgnoError(int 
1c910 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e  lineno, Pgno pgn
1c920 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  o){.  char zMsg[
1c930 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  100];.  sqlite3_
1c940 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1c950 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61  zMsg), zMsg, "da
1c960 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1c970 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f  n page %d", pgno
1c980 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
1c990 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c9a0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1c9b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1c9c0 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1c9d0 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f  _CORRUPT, lineno
1c9e0 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73  , zMsg);.}.int s
1c9f0 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72  qlite3NomemError
1ca00 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1ca10 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1ca20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1ca30 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1ca40 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1ca50 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rror(SQLITE_NOME
1ca60 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22  M, lineno, "OOM"
1ca70 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1ca80 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28  IoerrnomemError(
1ca90 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1caa0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1cab0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1cac0 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1cad0 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1cae0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1caf0 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20  _NOMEM, lineno, 
1cb00 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29  "I/O OOM error")
1cb10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1cb20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cb30 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
1cb40 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
1cb50 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
1cb60 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
1cb70 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
1cb80 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
1cb90 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
1cba0 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
1cbb0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
1cbc0 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
1cbd0 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
1cbe0 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
1cbf0 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
1cc00 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
1cc10 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
1cc20 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
1cc30 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
1cc40 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1cc50 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
1cc60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1cc70 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
1cc80 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
1cc90 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
1cca0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1ccb0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
1ccc0 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
1ccd0 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
1cce0 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74   details..*/.int
1ccf0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
1cd00 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
1cd10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cd30 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
1cd40 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1cd50 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
1cd60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1cd70 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
1cd80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1cd90 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
1cda0 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
1cdb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1cdc0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
1cdd0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
1cde0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1cdf0 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
1ce00 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
1ce10 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
1ce20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
1ce30 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
1ce40 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
1ce50 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1ce60 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
1ce70 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1ce80 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1ce90 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
1cea0 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
1ceb0 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
1cec0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1ced0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1cee0 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
1cef0 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
1cf00 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
1cf10 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1cf20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
1cf30 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
1cf40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1cf50 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1cf60 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
1cf70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
1cf80 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
1cf90 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63  nt iCol = 0;.  c
1cfa0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
1cfb0 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
1cfc0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
1cfd0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
1cfe0 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
1cff0 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
1d000 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
1d010 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
1d020 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1d030 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1d040 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1d050 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65  b) || zTableName
1d060 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1d070 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1d080 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1d090 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
1d0a0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1d0b0 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
1d0c0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
1d0d0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1d0e0 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
1d0f0 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
1d100 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1d110 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
1d120 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
1d130 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1d140 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1d150 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
1d160 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
1d170 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
1d180 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1d190 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
1d1a0 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
1d1b0 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
1d1c0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
1d1d0 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1d1e0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1d1f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
1d200 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
1d210 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
1d220 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
1d230 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b  ColumnName==0 ){
1d240 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f  .    /* Query fo
1d250 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74  r existance of t
1d260 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d  able only */.  }
1d270 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
1d280 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
1d290 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
1d2a0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
1d2b0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
1d2c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1d2d0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
1d2e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
1d2f0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
1d300 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1d310 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
1d320 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
1d330 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1d340 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71  owid(pTab) && sq
1d350 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
1d360 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1d370 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62       iCol = pTab
1d380 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
1d390 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20   pCol = iCol>=0 
1d3a0 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ? &pTab->aCol[iC
1d3b0 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  ol] : 0;.      }
1d3c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
1d3d0 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
1d3e0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1d3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d400 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1d410 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
1d420 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
1d430 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
1d440 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
1d450 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
1d460 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
1d470 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
1d480 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
1d490 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
1d4a0 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
1d4b0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1d4c0 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
1d4d0 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
1d4e0 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
1d4f0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
1d500 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
1d510 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
1d520 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
1d530 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
1d540 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
1d550 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
1d560 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
1d570 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
1d580 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
1d590 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1d5a0 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
1d5b0 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
1d5c0 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
1d5d0 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
1d5e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1d5f0 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
1d600 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
1d610 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c   zDataType = sql
1d620 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
1d630 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c  Col,0);.    zCol
1d640 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
1d650 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
1d660 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
1d670 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
1d680 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c  ey  = (pCol->col
1d690 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
1d6a0 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20  PRIMKEY)!=0;.   
1d6b0 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
1d6c0 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
1d6d0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1d6e0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
1d6f0 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
1d700 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1d710 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
1d720 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
1d730 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
1d740 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
1d750 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Seq = sqlite3Str
1d760 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72  BINARY;.  }..err
1d770 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
1d780 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
1d790 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
1d7a0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
1d7b0 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
1d7c0 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
1d7d0 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1d7e0 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
1d7f0 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
1d800 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
1d810 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
1d820 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
1d830 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
1d840 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
1d850 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
1d860 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
1d870 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
1d880 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
1d890 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
1d8a0 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
1d8b0 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
1d8c0 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
1d8d0 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
1d8e0 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
1d8f0 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
1d900 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
1d910 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
1d920 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
1d930 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
1d940 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
1d950 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
1d960 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d970 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1d980 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1d990 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1d9a0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
1d9b0 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
1d9c0 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
1d9d0 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
1d9e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d9f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
1da00 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
1da10 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
1da20 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
1da30 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
1da40 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1da50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1da60 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1da70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1da80 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1da90 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1daa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
1dab0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
1dac0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
1dad0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
1dae0 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
1daf0 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
1db00 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
1db10 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
1db20 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
1db30 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1db40 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
1db50 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
1db60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1db70 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
1db80 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
1db90 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
1dba0 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
1dbb0 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
1dbc0 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
1dbd0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
1dbe0 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
1dbf0 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
1dc00 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
1dc10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
1dc20 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
1dc30 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
1dc40 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
1dc50 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1dc60 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
1dc70 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
1dc80 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ff){.#ifdef SQLI
1dc90 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1dca0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1dcb0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1dcc0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1dcd0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1dce0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1dcf0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1dd00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1dd10 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
1dd20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
1dd30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
1dd40 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1dd50 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1dd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1dd70 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
1dd80 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
1dd90 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
1dda0 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
1ddb0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
1ddc0 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
1ddd0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1dde0 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
1ddf0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1de00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1de10 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65  E_ERROR;.  Btree
1de20 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65   *pBtree;..#ifde
1de30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1de40 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1de50 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1de60 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1de70 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1de80 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1de90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1dea0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1deb0 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74    pBtree = sqlit
1dec0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1ded0 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1dee0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1def0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1df00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1df10 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74  e *fd;.    sqlit
1df20 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1df30 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ree);.    pPager
1df40 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1df50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
1df60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1df70 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20  !=0 );.    fd = 
1df80 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1df90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
1dfa0 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
1dfb0 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
1dfc0 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
1dfd0 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1dfe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1dff0 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
1e000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1e020 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
1e030 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  FS_POINTER ){.  
1e040 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66      *(sqlite3_vf
1e050 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  s**)pArg = sqlit
1e060 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65  e3PagerVfs(pPage
1e070 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1e080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1e090 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
1e0a0 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c  TE_FCNTL_JOURNAL
1e0b0 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1e0c0 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1e0d0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1e0e0 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70  3PagerJrnlFile(p
1e0f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1e100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e110 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1e120 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
1e130 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  A_VERSION ){.   
1e140 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e     *(unsigned in
1e150 74 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  t*)pArg = sqlite
1e160 33 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f  3PagerDataVersio
1e170 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  n(pPager);.     
1e180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e1b0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1e1c0 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1e1d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e1e0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1e1f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1e200 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1e210 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1e220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  c;.}../*.** Inte
1e230 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
1e240 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
1e250 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
1e260 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
1e270 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
1e280 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1e290 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55  E_UNTESTABLE.  U
1e2a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1e2b0 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f  op);.#else.  va_
1e2c0 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1e2d0 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
1e2e0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
1e2f0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
1e300 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1e310 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
1e320 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e330 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e340 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
1e350 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
1e360 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
1e370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1e380 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1e390 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
1e3a0 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
1e3b0 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
1e3c0 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
1e3d0 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
1e3e0 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
1e3f0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
1e400 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
1e410 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
1e420 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
1e430 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
1e440 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e450 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
1e460 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e470 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
1e480 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1e490 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1e4a0 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
1e4b0 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
1e4c0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
1e4d0 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
1e4e0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
1e4f0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1e500 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
1e510 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
1e520 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
1e530 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
1e540 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
1e550 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
1e560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e570 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e580 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
1e590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
1e5a0 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
1e5b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e5c0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1e5d0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e5e0 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
1e5f0 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
1e600 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
1e610 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
1e620 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
1e630 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
1e640 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
1e650 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
1e660 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
1e670 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
1e680 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
1e690 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
1e6a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1e6b0 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
1e6c0 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
1e6d0 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
1e6e0 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
1e6f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1e700 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
1e710 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1e720 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
1e730 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e740 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
1e750 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
1e760 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1e770 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
1e780 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
1e790 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
1e7a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
1e7b0 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
1e7c0 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
1e7d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1e7e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1e7f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e800 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  ol(FAULT_INSTALL
1e810 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20  , xCallback).   
1e820 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e   **.    ** Arran
1e830 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61  ge to invoke xCa
1e840 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65  llback() wheneve
1e850 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  r sqlite3FaultSi
1e860 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20  m() is called,. 
1e870 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61     ** if xCallba
1e880 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ck is not NULL..
1e890 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73      **.    ** As
1e8a0 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66   a test of the f
1e8b0 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d  ault simulator m
1e8c0 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c  echanism itself,
1e8d0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1e8e0 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61  (0).    ** is ca
1e8f0 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
1e900 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e   after installin
1e910 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61  g the new callba
1e920 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ck and the retur
1e930 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66  n.    ** value f
1e940 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  rom sqlite3Fault
1e950 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74  Sim(0) becomes t
1e960 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20  he return from. 
1e970 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
1e980 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20  st_control()..  
1e990 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e9a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
1e9b0 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20  ULT_INSTALL: {. 
1e9c0 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
1e9d0 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
1e9e0 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
1e9f0 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
1ea00 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
1ea10 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
1ea20 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
1ea30 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
1ea40 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1ea50 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1ea60 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29  ap, int(*)(int))
1ea70 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
1ea80 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45   typedef int(*TE
1ea90 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1eaa0 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  )(int);.      sq
1eab0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1eac0 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1ead0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53  = va_arg(ap, TES
1eae0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1eaf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1eb00 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b  ite3FaultSim(0);
1eb10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eb20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1eb30 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1eb40 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
1eb50 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
1eb60 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
1eb70 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
1eb80 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
1eb90 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
1eba0 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
1ebb0 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
1ebc0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
1ebd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ebe0 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
1ebf0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
1ec00 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1ec10 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
1ec20 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
1ec30 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1ec40 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
1ec50 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1ec60 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
1ec70 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
1ec80 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1ec90 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1eca0 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
1ecb0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1ecc0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1ecd0 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
1ece0 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
1ecf0 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
1ed00 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
1ed10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1ed20 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1ed30 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ed40 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1ed50 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
1ed60 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
1ed70 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1ed80 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
1ed90 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1eda0 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
1edb0 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
1edc0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
1edd0 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
1ede0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
1edf0 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
1ee00 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
1ee10 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1ee20 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
1ee30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
1ee40 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
1ee50 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1ee60 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
1ee70 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
1ee80 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
1ee90 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
1eea0 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
1eeb0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1eec0 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
1eed0 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
1eee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
1eef0 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
1ef00 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
1ef10 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20   ** deleterious 
1ef20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
1ef30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ef40 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1ef50 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
1ef60 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
1ef70 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
1ef80 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
1ef90 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
1efa0 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
1efb0 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
1efc0 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
1efd0 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
1efe0 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
1eff0 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
1f000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1f020 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1f030 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f040 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f050 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
1f060 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1f070 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1f080 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1f090 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
1f0a0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
1f0b0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
1f0c0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1f0d0 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
1f0e0 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
1f0f0 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
1f100 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1f110 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1f120 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
1f130 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
1f140 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1f150 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1f160 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1f170 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
1f180 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
1f190 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1f1a0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
1f1b0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
1f1c0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
1f1d0 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
1f1e0 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
1f1f0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1f200 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
1f210 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
1f220 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
1f230 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f240 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1f250 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
1f260 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
1f270 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69      assert( /*si
1f280 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20  de-effects-ok*/ 
1f290 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
1f2a0 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
1f2b0 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
1f2c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1f2d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1f2e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f2f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f300 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
1f310 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f320 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1f330 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1f340 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
1f350 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
1f360 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
1f370 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
1f380 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
1f390 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f3a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f3b0 73 20 41 4c 57 41 59 53 28 58 29 20 69 66 20 58  s ALWAYS(X) if X
1f3c0 20 69 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69   is true, or 0 i
1f3d0 66 20 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  f X is false..  
1f3e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1f3f0 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74  recommended test
1f400 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68   is X==2.  If th
1f410 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f420 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  s 2, that means.
1f430 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20      ** ALWAYS() 
1f440 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1f450 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d  both no-op pass-
1f460 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20  through macros, 
1f470 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20  which is the.   
1f480 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74   ** default sett
1f490 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74  ing.  If the ret
1f4a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20  urn value is 1, 
1f4b0 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73  then ALWAYS() is
1f4c0 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68   either.    ** h
1f4d0 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1f4e0 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73  e or else it ass
1f4f0 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75  erts if its argu
1f500 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20  ment is false.. 
1f510 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
1f520 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63  behavior (hard-c
1f530 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73  oded to true) is
1f540 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1f550 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1f560 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1f570 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1f580 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74  s disabled and t
1f590 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
1f5a0 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72   behavior (asser
1f5b0 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
1f5c0 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73  t to ALWAYS() is
1f5d0 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63   false) is the c
1f5e0 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
1f5f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1f600 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
1f610 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1f620 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
1f630 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20  ** The run-time 
1f640 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d  test procedure m
1f650 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ight look someth
1f660 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ing like this:. 
1f670 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f680 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1f690 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f6a0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1f6b0 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a   2)==2 ){.    **
1f6c0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1f6d0 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1f6e0 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  e no-op pass-thr
1f6f0 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20  ough macros.    
1f700 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  **    }else if( 
1f710 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1f720 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1f730 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20  CTRL_ASSERT, 1) 
1f740 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1f750 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65  / ALWAYS(x) asse
1f760 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72  rts that x is tr
1f770 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73  ue. NEVER(x) ass
1f780 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e  erts x is false.
1f790 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1f7a0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1f7b0 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20   ALWAYS(x) is a 
1f7c0 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56  constant 1.  NEV
1f7d0 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  ER(x) is a const
1f7e0 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20  ant 0..    **   
1f7f0 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61   }.    */.    ca
1f800 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f810 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20  RL_ALWAYS: {.   
1f820 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1f830 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1f840 20 72 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53   rc = x ? ALWAYS
1f850 28 78 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  (x) : 0;.      b
1f860 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1f870 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
1f880 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f890 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f8a0 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
1f8b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1f8c0 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
1f8d0 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
1f8e0 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
1f8f0 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
1f900 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
1f910 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
1f920 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
1f930 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1f940 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1f950 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1f960 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
1f970 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1f980 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1f990 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
1f9a0 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
1f9b0 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1f9c0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1f9d0 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
1f9e0 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1f9f0 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1fa00 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1fa10 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
1fa20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1fa30 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
1fa40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
1fa50 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
1fa60 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
1fa70 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
1fa80 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
1fa90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1faa0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1fab0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1fac0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1fad0 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
1fae0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1faf0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
1fb00 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
1fb10 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1fb20 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
1fb30 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
1fb40 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1fb50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fb60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1fb70 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1fb80 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1fb90 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1fba0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1fbb0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1fbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1fbd0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1fbe0 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1fbf0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1fc00 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1fc10 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1fc20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1fc30 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1fc40 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1fc50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1fc60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1fc70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1fc80 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1fc90 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1fca0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1fcb0 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1fcc0 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1fcd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1fce0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1fcf0 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1fd00 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1fd10 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1fd20 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1fd30 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1fd40 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1fd50 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1fd60 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1fd70 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1fd80 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1fd90 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1fda0 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1fdb0 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1fdc0 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1fdd0 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1fde0 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1fdf0 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1fe00 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1fe10 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1fe20 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1fe30 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1fe40 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1fe50 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1fe60 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1fe70 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1fe80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fe90 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1fea0 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1feb0 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1fec0 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1fed0 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1fee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fef0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1ff00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ff10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ff20 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
1ff30 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
1ff40 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
1ff50 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
1ff60 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65   non-zero, subse
1ff70 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
1ff80 6f 63 61 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a  ocaltime().    *
1ff90 2a 20 61 6e 64 20 69 74 73 20 76 61 72 69 61 6e  * and its varian
1ffa0 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1ffb0 66 20 69 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20  f is zero, undo 
1ffc0 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20  this setting..  
1ffd0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ffe0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1fff0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
20000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
20010 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
20020 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f  ltimeFault = va_
20030 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
20040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20050 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
20060 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
20070 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20080 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20  INTERNAL_FUNCS, 
20090 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  int onoff);.    
200a0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72  **.    ** If par
200b0 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20  ameter onoff is 
200c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e  non-zero, intern
200d0 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20  al-use-only SQL 
200e0 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  functions.    **
200f0 20 61 72 65 20 76 69 73 69 62 6c 65 20 74 6f 20   are visible to 
20100 6f 72 64 69 6e 61 72 79 20 53 51 4c 2e 20 20 54  ordinary SQL.  T
20110 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 66 6f  his is useful fo
20120 72 20 74 65 73 74 69 6e 67 20 62 75 74 20 69 73  r testing but is
20130 0a 20 20 20 20 2a 2a 20 75 6e 73 61 66 65 20 62  .    ** unsafe b
20140 65 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 70  ecause invalid p
20150 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 6f  arameters to tho
20160 73 65 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d  se internal-use-
20170 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20  only functions. 
20180 20 20 20 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74     ** can result
20190 20 69 6e 20 63 72 61 73 68 65 73 20 6f 72 20 73   in crashes or s
201a0 65 67 66 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f  egfaults..    */
201b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
201c0 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e  _TESTCTRL_INTERN
201d0 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a  AL_FUNCTIONS: {.
201e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
201f0 62 61 6c 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72  balConfig.bInter
20200 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76  nalFunctions = v
20210 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
20220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20230 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
20240 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
20250 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
20260 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
20270 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
20280 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
20290 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
202a0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
202b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
202c0 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
202d0 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
202e0 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
202f0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
20300 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
20310 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
20320 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
20330 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
20340 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
20350 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
20360 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
20370 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
20380 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
20390 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
203a0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
203b0 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
203c0 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
203d0 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
203e0 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
203f0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
20400 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
20410 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
20420 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
20430 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
20440 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
20450 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
20460 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
20470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
20480 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68 72    /* Set the thr
20490 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68 20  eshold at which 
204a0 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73  OP_Once counters
204b0 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20 7a   reset back to z
204c0 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64  ero..    ** By d
204d0 65 66 61 75 6c 74 20 74 68 69 73 20 69 73 20 30  efault this is 0
204e0 78 37 66 66 66 66 66 66 65 20 28 6f 76 65 72 20  x7ffffffe (over 
204f0 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20  2 billion), but 
20500 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20 20  that value is.  
20510 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20    ** too big to 
20520 74 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f 6e  test in a reason
20530 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74  able amount of t
20540 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e  ime, so this con
20550 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70  trol is.    ** p
20560 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20 61  rovided to set a
20570 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c   small and easil
20580 79 20 72 65 61 63 68 61 62 6c 65 20 72 65 73 65  y reachable rese
20590 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  t value..    */.
205a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
205b0 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45  TESTCTRL_ONCE_RE
205c0 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b  SET_THRESHOLD: {
205d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
205e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65  obalConfig.iOnce
205f0 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20 3d  ResetThreshold =
20600 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
20610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
20630 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
20640 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
20650 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
20660 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74  E, xCallback, pt
20670 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r);.    **.    *
20680 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63  * Set the VDBE c
20690 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b  overage callback
206a0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61   function to xCa
206b0 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74  llback with cont
206c0 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ext .    ** poin
206d0 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a  ter ptr..    */.
206e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
206f0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
20700 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66  VERAGE: {.#ifdef
20710 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
20720 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65  ERAGE.      type
20730 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63  def void (*branc
20740 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  h_callback)(void
20750 2a 2c 75 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a  *,unsigned int,.
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
20790 68 61 72 2c 75 6e 73 69 67 6e 65 64 20 63 68 61  har,unsigned cha
207a0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
207b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56  3GlobalConfig.xV
207c0 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61  dbeBranch = va_a
207d0 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c  rg(ap,branch_cal
207e0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71  lback);.      sq
207f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20800 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67  g.pVdbeBranchArg
20810 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69   = va_arg(ap,voi
20820 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  d*);.#endif.    
20830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20840 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20850 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20860 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
20870 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e  RTER_MMAP, db, n
20880 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73  Max); */.    cas
20890 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
208a0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b  L_SORTER_MMAP: {
208b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
208c0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
208d0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
208e0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
208f0 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
20900 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
20910 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20920 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
20930 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20940 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29  TESTCTRL_ISINIT)
20950 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20960 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20970 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62   if SQLite has b
20980 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
20990 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  and SQLITE_ERROR
209a0 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a   if.    ** not..
209b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
209c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
209d0 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20  ISINIT: {.      
209e0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
209f0 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
20a00 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
20a10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
20a20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20a30 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
20a40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20a50 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
20a60 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e  , db, dbName, on
20a70 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  Off, tnum);.    
20a80 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
20a90 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75  est control is u
20aa0 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d  sed to create im
20ab0 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
20ac0 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65  "db" is a pointe
20ad0 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  r.    ** to the 
20ae0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20af0 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20  ion.  dbName is 
20b00 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
20b10 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72  e (ex: "main" or
20b20 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20  .    ** "temp") 
20b30 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69  which will recei
20b40 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e  ve the imposter.
20b50 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20    "onOff" turns 
20b60 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
20b70 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20  .    ** or off. 
20b80 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72   "tnum" is the r
20b90 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
20ba0 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20  b-tree to which 
20bb0 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20  the imposter.   
20bc0 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64   ** table should
20bd0 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a   connect..    **
20be0 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69  .    ** Enable i
20bf0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c  mposter mode onl
20c00 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  y when the schem
20c10 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
20c20 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e  en parsed.  Then
20c30 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69  .    ** run a si
20c40 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c  ngle CREATE TABL
20c50 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63  E statement to c
20c60 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70  onstruct the imp
20c70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20  oster table in. 
20c80 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64     ** the parsed
20c90 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74   schema.  Then t
20ca0 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  urn imposter mod
20cb0 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e  e back off again
20cc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20cd0 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20  If onOff==0 and 
20ce0 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65  tnum>0 then rese
20cf0 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
20d00 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20   all databases, 
20d10 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  causing.    ** t
20d20 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20  he schema to be 
20d30 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78  reparsed the nex
20d40 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65  t time it is nee
20d50 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74  ded.  This has t
20d60 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74  he.    ** effect
20d70 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20   of erasing all 
20d80 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
20d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20da0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20db0 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20  _IMPOSTER: {.   
20dc0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
20dd0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
20de0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  te3*);.      sql
20df0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20e00 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
20e10 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20     db->init.iDb 
20e20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
20e30 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61  ame(db, va_arg(a
20e40 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  p,const char*));
20e50 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
20e60 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
20e70 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20  imposterTable = 
20e80 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
20e90 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e        db->init.n
20ea0 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28  ewTnum = va_arg(
20eb0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  ap,int);.      i
20ec0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
20ed0 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  ==0 && db->init.
20ee0 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  newTnum>0 ){.   
20ef0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
20f00 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
20f10 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
20f20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20f30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
20f40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
20f50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
20f60 69 66 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56  if defined(YYCOV
20f70 45 52 41 47 45 29 0a 20 20 20 20 2f 2a 20 20 73  ERAGE).    /*  s
20f80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
20f90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
20fa0 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52  TRL_PARSER_COVER
20fb0 41 47 45 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a  AGE, FILE *out).
20fc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
20fd0 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
20fe0 28 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  (only available 
20ff0 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 63  when SQLite is c
21000 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 20  ompiled with.   
21010 20 2a 2a 20 2d 44 59 59 43 4f 56 45 52 41 47 45   ** -DYYCOVERAGE
21020 29 20 77 72 69 74 65 73 20 61 20 72 65 70 6f 72  ) writes a repor
21030 74 20 6f 6e 74 6f 20 22 6f 75 74 22 20 74 68 61  t onto "out" tha
21040 74 20 73 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20  t shows all.    
21050 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65  ** state/lookahe
21060 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ad combinations 
21070 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73 74  in the parser st
21080 61 74 65 20 6d 61 63 68 69 6e 65 0a 20 20 20 20  ate machine.    
21090 2a 2a 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  ** which are nev
210a0 65 72 20 65 78 65 72 63 69 73 65 64 2e 20 20 49  er exercised.  I
210b0 66 20 61 6e 79 20 73 74 61 74 65 20 69 73 20 6d  f any state is m
210c0 69 73 73 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a  issed, make the.
210d0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f      ** return co
210e0 64 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  de SQLITE_ERROR.
210f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21100 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21110 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
21120 3a 20 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a  : {.      FILE *
21130 6f 75 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  out = va_arg(ap,
21140 20 46 49 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69   FILE*);.      i
21150 66 28 20 73 71 6c 69 74 65 33 50 61 72 73 65 72  f( sqlite3Parser
21160 43 6f 76 65 72 61 67 65 28 6f 75 74 29 20 29 20  Coverage(out) ) 
21170 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
21180 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
21190 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
211a0 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
211b0 47 45 29 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f  GE) */.  }.  va_
211c0 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
211d0 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  /* SQLITE_UNTEST
211e0 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ABLE */.  return
211f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
21200 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
21210 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20  routine, useful 
21220 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  to VFS implement
21230 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65  ations, that che
21240 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  cks.** to see if
21250 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
21260 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74 20   was a URI that 
21270 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63  contained a spec
21280 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70  ific query .** p
21290 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66  arameter, and if
212a0 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20   so obtains the 
212b0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65  value of the que
212c0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ry parameter..**
212d0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
212e0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
212f0 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74  e filename point
21300 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  er passed into t
21310 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65  he xOpen().** me
21320 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d  thod of a VFS im
21330 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
21340 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65  he zParam argume
21350 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
21360 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  f the.** query p
21370 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b  arameter we seek
21380 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21390 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
213a0 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a  e of the zParam.
213b0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66 20  ** parameter if 
213c0 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 74  it exists.  If t
213d0 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65  he parameter doe
213e0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  s not exist, thi
213f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
21400 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  urns a NULL poin
21410 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ter..*/.const ch
21420 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f  ar *sqlite3_uri_
21430 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20  parameter(const 
21440 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
21450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
21460 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c  ram){.  if( zFil
21470 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72  ename==0 || zPar
21480 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  am==0 ) return 0
21490 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
214a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
214b0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
214c0 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
214d0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
214e0 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
214f0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
21500 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
21510 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
21520 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
21530 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
21540 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
21550 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
21560 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
21570 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
21580 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21590 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
215a0 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
215b0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
215c0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
215d0 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
215e0 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
215f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
21600 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
21610 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
21620 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
21630 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
21640 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
21650 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
21660 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
21670 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
21680 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
21690 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
216a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
216b0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
216c0 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
216d0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
216e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
216f0 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
21700 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21710 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
21720 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
21730 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
21740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
21750 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
21760 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
21770 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
21780 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
21790 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
217a0 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
217b0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
217c0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
217d0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
217e0 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
217f0 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
21800 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
21810 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
21820 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d  HexToI64(z, &v)=
21830 3d 30 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  =0 ){.    bDflt 
21840 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
21850 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
21860 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
21870 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
21880 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
21890 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
218a0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
218b0 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
218c0 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
218d0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
218e0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
218f0 20 69 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e 61   int iDb = zDbNa
21900 6d 65 20 3f 20 73 71 6c 69 74 65 33 46 69 6e 64  me ? sqlite3Find
21910 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61  DbName(db, zDbNa
21920 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  me) : 0;.  retur
21930 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a 20 64 62  n iDb<0 ? 0 : db
21940 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
21950 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21960 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
21970 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
21980 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
21990 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
219a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
219b0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
219c0 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
219d0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
219e0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
219f0 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
21a00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21a10 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
21a20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
21a30 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
21a40 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
21a50 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
21a60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
21a70 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69  dif.  pBt = sqli
21a80 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
21a90 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
21aa0 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
21ab0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
21ac0 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
21ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21ae0 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
21af0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
21b00 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
21b10 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
21b20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
21b30 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
21b40 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
21b50 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
21b60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21b70 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
21b80 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
21b90 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
21ba0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
21bb0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
21bc0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
21bd0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
21be0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
21bf0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  -1;.  }.#endif. 
21c00 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
21c10 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
21c20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
21c30 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
21c40 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
21c50 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69  pBt) : -1;.}..#i
21c60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21c70 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
21c80 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73  * Obtain a snaps
21c90 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  hot handle for t
21ca0 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64  he snapshot of d
21cb0 61 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72  atabase zDb curr
21cc0 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20  ently .** being 
21cd0 72 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64  read by handle d
21ce0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
21cf0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a  3_snapshot_get(.
21d00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
21d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21d20 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  b,.  sqlite3_sna
21d30 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68  pshot **ppSnapsh
21d40 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ot.){.  int rc =
21d50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23   SQLITE_ERROR;.#
21d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21d70 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53  IT_WAL..#ifdef S
21d80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
21d90 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
21da0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
21db0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
21dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
21dd0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
21de0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
21df0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
21e00 74 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d  tex);..  if( db-
21e10 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
21e20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  {.    int iDb = 
21e30 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
21e40 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  e(db, zDb);.    
21e50 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
21e60 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72  b>1 ){.      Btr
21e70 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
21e80 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
21e90 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
21ea0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
21eb0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Bt) ){.        r
21ec0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21ed0 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
21ee0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
21ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21f20 6e 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74  napshotGet(sqlit
21f30 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
21f40 29 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a  ), ppSnapshot);.
21f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21f60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
21f70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21f80 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
21f90 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
21fa0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
21fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21fc0 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
21fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
21fe0 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e  he snapshot iden
21ff0 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73  dified by pSnaps
22000 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hot..*/.int sqli
22010 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
22020 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
22030 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
22040 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33  *zDb, .  sqlite3
22050 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
22060 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
22070 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
22080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22090 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
220a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
220b0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
220c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
220d0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
220e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
220f0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
22100 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
22110 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
22120 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
22130 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
22140 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  ){.    int iDb;.
22150 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
22160 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
22170 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
22180 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
22190 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
221a0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
221b0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
221c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
221d0 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b  Trans(pBt)==0 ){
221e0 0a 20 20 20 20 20 20 20 20 50 61 67 65 72 20 2a  .        Pager *
221f0 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
22200 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
22210 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e  .        int bUn
22220 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  lock = 0;.      
22230 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
22240 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
22250 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
22260 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
22270 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ctive==0 ){.    
22280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22290 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
222a0 74 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20 70  tCheck(pPager, p
222b0 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
222c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
222d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
222e0 20 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f 63            bUnloc
222f0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  k = 1;.         
22300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22310 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74  3BtreeCommit(pBt
22320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22360 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
22370 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22390 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
223a0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
223b0 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53 6e  Open(pPager, pSn
223c0 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20  apshot);.       
223d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
223e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
223f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22400 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
22410 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29  Trans(pBt, 0, 0)
22420 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
22430 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
22440 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  Open(pPager, 0);
22450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22460 20 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29     if( bUnlock )
22470 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22480 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
22490 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  Unlock(pPager);.
224a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
224c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
224d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
224e0 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
224f0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
22500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22510 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d  .** Recover as m
22520 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73  any snapshots as
22530 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
22540 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f  he wal file asso
22550 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73  ciated with.** s
22560 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74  chema zDb of dat
22570 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  abase db..*/.int
22580 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
22590 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65  t_recover(sqlite
225a0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
225b0 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72  r *zDb){.  int r
225c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
225d0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66  ;.  int iDb;.#if
225e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
225f0 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
22600 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
22610 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
22620 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
22630 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
22640 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
22650 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
22660 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f..  sqlite3_mut
22670 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
22680 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ex);.  iDb = sql
22690 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
226a0 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69  b, zDb);.  if( i
226b0 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
226c0 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
226d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
226e0 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  pBt;.    if( 0==
226f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
22700 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
22710 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22720 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
22730 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ans(pBt, 0, 0);.
22740 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22770 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63 6f  agerSnapshotReco
22780 76 65 72 28 73 71 6c 69 74 65 33 42 74 72 65 65  ver(sqlite3Btree
22790 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
227a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
227b0 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
227c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
227d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
227e0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
227f0 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
22800 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
22810 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22820 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e  ./*.** Free a sn
22830 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62  apshot handle ob
22840 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
22850 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
22860 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
22870 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
22880 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  e(sqlite3_snapsh
22890 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a  ot *pSnapshot){.
228a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
228b0 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e  Snapshot);.}.#en
228c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
228d0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
228e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
228f0 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
22900 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20  ION_DIAGS./*.** 
22910 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
22920 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  f a compile-time
22930 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20   option, return 
22940 74 72 75 65 20 69 66 20 74 68 61 74 20 6f 70 74  true if that opt
22950 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20  ion.** was used 
22960 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
22970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65  ..**.** The name
22980 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20   can optionally 
22990 62 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49  begin with "SQLI
229a0 54 45 5f 22 20 62 75 74 20 74 68 65 20 22 53 51  TE_" but the "SQ
229b0 4c 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a  LITE_" prefix.**
229c0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
229d0 20 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f   for a match..*/
229e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d  .int sqlite3_com
229f0 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
22a00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
22a10 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Name){.  int i, 
22a20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20  n;.  int nOpt;. 
22a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
22a40 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69  CompileOpt;. .#i
22a50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22a60 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
22a70 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zOptName==0 ){. 
22a80 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
22a90 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
22aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
22ab0 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69  endif..  azCompi
22ac0 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43  leOpt = sqlite3C
22ad0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e  ompileOptions(&n
22ae0 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  Opt);..  if( sql
22af0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70  ite3StrNICmp(zOp
22b00 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22  tName, "SQLITE_"
22b10 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61  , 7)==0 ) zOptNa
22b20 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73  me += 7;.  n = s
22b30 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
22b40 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  OptName);..  /* 
22b50 53 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f  Since nOpt is no
22b60 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65  rmally in single
22b70 20 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61   digits, a linea
22b80 72 20 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a  r search is .  *
22b90 2a 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e  * adequate. No n
22ba0 65 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79  eed for a binary
22bb0 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f   search. */.  fo
22bc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69  r(i=0; i<nOpt; i
22bd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
22be0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70  ite3StrNICmp(zOp
22bf0 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65  tName, azCompile
22c00 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20  Opt[i], n)==0.  
22c10 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 49     && sqlite3IsI
22c20 64 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20  dChar((unsigned 
22c30 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70  char)azCompileOp
22c40 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20  t[i][n])==0.    
22c50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22c60 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22c70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22c80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74  * Return the N-t
22c90 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  h compile-time o
22ca0 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49  ption string.  I
22cb0 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
22cc0 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61  nge,.** return a
22cd0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
22ce0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
22cf0 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
22d00 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a  ion_get(int N){.
22d10 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f    int nOpt;.  co
22d20 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d  nst char **azCom
22d30 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d  pileOpt;.  azCom
22d40 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65  pileOpt = sqlite
22d50 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28  3CompileOptions(
22d60 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e  &nOpt);.  if( N>
22d70 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a  =0 && N<nOpt ){.
22d80 20 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d      return azCom
22d90 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a  pileOpt[N];.  }.
22da0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22db0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22dc0 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
22dd0 4e 5f 44 49 41 47 53 20 2a 2f 0a                 N_DIAGS */.