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

Artifact 65f0e265a9f4f3b975f731247d035e15c4f805748d12c8a9ddd7a2d8d73a4789:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75  ES */..    defau
5de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5df0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5e20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5e40: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5e50: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5e60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e70: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5e80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5e90: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5ea0: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5eb0: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5ec0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5ed0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5f00: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5f10: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5f20: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5f30: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5f40: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5f50: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5f60: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5f70: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5f80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5fa0: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5fb0: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5fc0: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5fd0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5fe0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6000: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
6010: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
6020: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
6030: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
6040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6050: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
6060: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
6070: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
6080: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
6090: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
60b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
60c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
60d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
60e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
60f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
6100: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
6110: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
6120: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6130: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6140: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6150: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6160: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6180: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6190: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
61a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
61b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
61c0: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
61d0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
61e0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
61f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
6200: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
6210: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
6220: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6230: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6240: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6250: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6260: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6270: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6280: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6290: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
62a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
62b0: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
62c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
62e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
62f0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
6300: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
6310: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
6320: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6330: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6340: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6350: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6360: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6370: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6380: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6390: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
63a0: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
63b0: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
63c0: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
63d0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
6400: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
6410: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
6420: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6430: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6440: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6450: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6460: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6470: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6480: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6490: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
64a0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
64b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
64c0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
64d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
64e0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
64f0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
6500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6510: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
6520: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6530: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6540: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6550: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6560: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6570: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6580: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6590: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
65a0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
65b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
65c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
65d0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
65e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
65f0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6600: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
6610: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
6620: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6630: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6640: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6650: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6660: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6670: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
66a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
66b0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
66c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
66d0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
66e0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
66f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6710: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6720: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6730: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6740: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6750: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6780: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6790: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
67a0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
67b0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
67c0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
67d0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6810: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6830: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6850: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6870: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6890: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
68a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
68e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
68f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6900: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6910: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6920: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6940: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6950: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6970: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
69c0: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
69d0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
69e0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
69f0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6a00: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6a10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6a20: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6a30: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6a40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a50: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6a60: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6a80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6a90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6aa0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6ab0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6ac0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6ad0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6ae0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6af0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6b00: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6b10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6b40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6b50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6b60: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6b70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6b80: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6b90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6ba0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6bb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6bc0: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6bd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6bf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6c00: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6c10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6c20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6c30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6c40: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6c60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6c70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6c90: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ca0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6cc0: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6cd0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6ce0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6cf0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6d00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6d20: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6d30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6d40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6d50: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6d60: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6d70: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6d80: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6da0: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6db0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6dc0: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6dd0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6de0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6e30: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6e40: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6e50: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6e60: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6e70: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6e80: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6e90: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6ea0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6eb0: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6ec0: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6ed0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6ee0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6ef0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6f00: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6f10: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6f20: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6f30: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6f60: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6f80: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6f90: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6fa0: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6fb0: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6fc0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6fd0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6fe0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ff0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
7000: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7010: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
7020: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
7030: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
7040: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7050: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7060: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
7070: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
7080: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
7090: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
70a0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
70b0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
70c0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
70d0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
70e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
70f0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7100: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7110: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7120: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7130: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7140: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7150: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7160: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7170: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7180: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7190: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71a0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
71b0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
71c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
71d0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
71e0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
71f0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7200: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7210: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7220: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7230: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7240: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  se  },.        {
7250: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7260: 5f 44 45 46 45 4e 53 49 56 45 2c 20 20 20 20 20  _DEFENSIVE,     
7270: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
7280: 65 66 65 6e 73 69 76 65 20 20 20 20 20 20 7d 2c  efensive      },
7290: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
72a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
72b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
72c0: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
72d0: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
72e0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
72f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
7300: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
7310: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
7320: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
7330: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
7340: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
7350: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
7360: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
7370: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
7380: 20 20 20 20 20 20 20 75 36 34 20 6f 6c 64 46 6c         u64 oldFl
7390: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
73a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
73b0: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
73c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
73d0: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
73e0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
73f0: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
7400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7410: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75  db->flags &= ~(u
7420: 36 34 29 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  64)aFlagOp[i].ma
7430: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sk;.          }.
7440: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c            if( ol
7450: 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67  dFlags!=db->flag
7460: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7470: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
7480: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
7490: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  (db, 0);.       
74a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
74b0: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
74c0: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
74d0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
74e0: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
74f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7500: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7510: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
7520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7530: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7540: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7550: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
7560: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
7570: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7580: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
7590: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
75a0: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
75b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
75c0: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
75d0: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
75e0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
75f0: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
7600: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
7610: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
7620: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
7630: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
7640: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
7650: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
7660: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
7670: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
7680: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
7690: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
76a0: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
76b0: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
76c0: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
76d0: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
76e0: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
76f0: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
7700: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
7710: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
7720: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
7730: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7740: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
7750: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7760: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
7770: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
7780: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
7790: 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Key2;.  /* EVIDE
77a0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d  NCE-OF: R-65033-
77b0: 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d  28449 The built-
77c0: 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  in BINARY collat
77d0: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a  ion compares.  *
77e0: 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20 62  * strings byte b
77f0: 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68 65  y byte using the
7800: 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69   memcmp() functi
7810: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  on from the stan
7820: 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72  dard C.  ** libr
7830: 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ary. */.  assert
7840: 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79 32  ( pKey1 && pKey2
7850: 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d   );.  rc = memcm
7860: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
7870: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
7880: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
7890: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
78a0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
78b0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
78c0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
78d0: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
78e0: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
78f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
7900: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32  DENCE-OF: R-3162
7910: 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69 73  4-24737 RTRIM is
7920: 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63   like BINARY exc
7930: 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a 20  ept that extra. 
7940: 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61       ** spaces a
7950: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74  t the end of eit
7960: 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f  her string do no
7970: 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65 73  t change the res
7980: 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20  ult. In other.  
7990: 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74      ** words, st
79a0: 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61  rings will compa
79b0: 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20  re equal to one 
79c0: 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20  another as long 
79d0: 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a  as they.      **
79e0: 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20   differ only in 
79f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  the number of sp
7a00: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e  aces at the end.
7a10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
7a20: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7a30: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
7a40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7a50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7a60: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43 6f  eturn true if Co
7a70: 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65 66  llSeq is the def
7a80: 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42 49  ault built-in BI
7a90: 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  NARY..*/.int sql
7aa0: 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f 6e  ite3IsBinary(con
7ab0: 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b 0a  st CollSeq *p){.
7ac0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
7ad0: 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43 6f  | p->xCmp!=binCo
7ae0: 6c 6c 46 75 6e 63 20 7c 7c 20 70 2d 3e 70 55 73  llFunc || p->pUs
7af0: 65 72 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  er!=0.          
7b00: 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 2d 3e 7a    || strcmp(p->z
7b10: 4e 61 6d 65 2c 22 42 49 4e 41 52 59 22 29 3d 3d  Name,"BINARY")==
7b20: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3d  0 );.  return p=
7b30: 3d 30 20 7c 7c 20 28 70 2d 3e 78 43 6d 70 3d 3d  =0 || (p->xCmp==
7b40: 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 26 26 20 70  binCollFunc && p
7b50: 2d 3e 70 55 73 65 72 3d 3d 30 29 3b 0a 7d 0a 0a  ->pUser==0);.}..
7b60: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
7b70: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
7b80: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
7b90: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
7ba0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7bb0: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
7bc0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
7bd0: 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a  se independent.*
7be0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
7bf0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
7c00: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
7c10: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
7c20: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
7c30: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
7c40: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
7c50: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
7c60: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
7c70: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
7c80: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
7c90: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
7ca0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
7cb0: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
7cc0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
7cd0: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
7ce0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
7cf0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
7d00: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
7d10: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
7d20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
7d30: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
7d40: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
7d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7d60: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
7d70: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
7d80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7d90: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
7da0: 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72  f( 0==r ){.    r
7db0: 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a   = nKey1-nKey2;.
7dc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
7dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7de0: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65  the ROWID of the
7df0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
7e00: 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e  ert.*/.sqlite_in
7e10: 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  t64 sqlite3_last
7e20: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71  _insert_rowid(sq
7e30: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7e40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7e50: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
7e60: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
7e70: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
7e80: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
7e90: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
7ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7eb0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7ec0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
7ed0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
7ee0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7ef0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  the sqlite3_last
7f00: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
7f10: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
7f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 65  .void sqlite3_se
7f30: 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  t_last_insert_ro
7f40: 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
7f50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
7f60: 52 6f 77 69 64 29 7b 0a 23 69 66 64 65 66 20 53  Rowid){.#ifdef S
7f70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7f80: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7f90: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7fa0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7fb0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7fc0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7fd0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7ff0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8000: 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  .  db->lastRowid
8010: 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c   = iRowid;.  sql
8020: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8030: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a  (db->mutex);.}..
8040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8050: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
8060: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
8070: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
8080: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
8090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
80a0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
80b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
80c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
80d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
80e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
80f0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
8100: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
8110: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
8120: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
8130: 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65  turn db->nChange
8140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8150: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8160: 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68  changes since th
8170: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
8180: 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f  e was opened..*/
8190: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74  .int sqlite3_tot
81a0: 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  al_changes(sqlit
81b0: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
81c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
81d0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
81e0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
81f0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
8200: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
8210: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
8220: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
8230: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  f.  return db->n
8240: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
8250: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
8260: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
8270: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
8280: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
8290: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
82a0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
82b0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
82c0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
82d0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
82e0: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
82f0: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
8300: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
8310: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
8320: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
8330: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
8340: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
8350: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
8360: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
8370: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
8380: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
8390: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
83a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
83b0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
83c0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
83d0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
83e0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
83f0: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
8400: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
8410: 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   Invoke the dest
8420: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
8430: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8440: 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e  FuncDef p, if an
8450: 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66  y. Except,.** if
8460: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
8470: 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68   last copy of th
8480: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e  e function, do n
8490: 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75  ot invoke it. Mu
84a0: 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73  ltiple.** copies
84b0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e   of a single fun
84c0: 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65  ction are create
84d0: 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75  d when create_fu
84e0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c  nction() is call
84f0: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
8500: 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63  E_ANY as the enc
8510: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
8520: 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65   void functionDe
8530: 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64  stroy(sqlite3 *d
8540: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a  b, FuncDef *p){.
8550: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
8560: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20   *pDestructor = 
8570: 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72  p->u.pDestructor
8580: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
8590: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
85a0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
85b0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
85c0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
85d0: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
85e0: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
85f0: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
8600: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
8610: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
8620: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
8630: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
8640: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
8650: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
8660: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
8670: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8680: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
8690: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
86a0: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
86b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
86c0: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
86d0: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
86e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
86f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8700: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48  BLE.  int i;.  H
8710: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71  ashElem *p;.  sq
8720: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
8730: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
8740: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8750: 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  +){.    Schema *
8760: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
8770: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
8780: 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b    if( pSchema ){
8790: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
87a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
87b0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
87c0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
87d0: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
87e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
87f0: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
8800: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
8810: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
8820: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
8830: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
8840: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
8850: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
8860: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
8870: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
8880: 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  e); p; p=sqliteH
8890: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
88a0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
88b0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
88c0: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
88d0: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54   if( pMod->pEpoT
88e0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
88f0: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
8900: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f  t(db, pMod->pEpo
8910: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
8920: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
8930: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
8940: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
8950: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
8960: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8970: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
8980: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
8990: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
89a0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
89b0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
89c0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
89d0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
89e0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
89f0: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
8a00: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
8a10: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
8a20: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
8a30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8a40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
8a50: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
8a60: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
8a70: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
8a80: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
8a90: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
8aa0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
8ab0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
8ac0: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
8ad0: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
8ae0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
8af0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8b00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
8b10: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
8b20: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
8b30: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
8b40: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
8b50: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
8b60: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
8b70: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
8b80: 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30  F: R-63257-11740
8b90: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
8ba0: 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20  _close() or.    
8bb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ** sqlite3_close
8bc0: 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c  _v2() with a NUL
8bd0: 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65  L pointer argume
8be0: 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  nt is a harmless
8bf0: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72   no-op. */.    r
8c00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8c10: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
8c20: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
8c30: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
8c40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c50: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
8c60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8c70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8c80: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72  );.  if( db->mTr
8c90: 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41  ace & SQLITE_TRA
8ca0: 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  CE_CLOSE ){.    
8cb0: 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54  db->xTrace(SQLIT
8cc0: 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20 64  E_TRACE_CLOSE, d
8cd0: 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 64 62  b->pTraceArg, db
8ce0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
8cf0: 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63  Force xDisconnec
8d00: 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76  t calls on all v
8d10: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
8d20: 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  .  disconnectAll
8d30: 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  Vtab(db);..  /* 
8d40: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
8d50: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69   is open, the di
8d60: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8d70: 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a  ) call above.  *
8d80: 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20  * will not have 
8d90: 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63  called the xDisc
8da0: 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20  onnect() method 
8db0: 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20  on any virtual. 
8dc0: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
8dd0: 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20  e db->aVTrans[] 
8de0: 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f  array. The follo
8df0: 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62  wing sqlite3Vtab
8e00: 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20  Rollback().  ** 
8e10: 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e  call will do so.
8e20: 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74   We need to do t
8e30: 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63  his before the c
8e40: 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a  heck for active.
8e50: 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
8e60: 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68  nts below, as th
8e70: 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d  e v-table implem
8e80: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  entation may be 
8e90: 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d  storing.  ** som
8ea0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
8eb0: 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ments internally
8ec0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
8ed0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
8ee0: 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62  ;..  /* Legacy b
8ef0: 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33  ehavior (sqlite3
8f00: 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f  _close() behavio
8f10: 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a  r) is to return.
8f20: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
8f30: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
8f40: 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c  on can not be cl
8f50: 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  osed immediately
8f60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f  ..  */.  if( !fo
8f70: 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e  rceZombie && con
8f80: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
8f90: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8fa0: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
8fb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75   SQLITE_BUSY, "u
8fc0: 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64  nable to close d
8fd0: 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65  ue to unfinalize
8fe0: 64 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74  d ".       "stat
8ff0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
9000: 73 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a  shed backups");.
9010: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
9020: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9030: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  x);.    return S
9040: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
9050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9060: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
9070: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
9080: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
9090: 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67  {.    /* Closing
90a0: 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75   the handle. Fou
90b0: 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
90c0: 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
90d0: 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  e 2. */.    sqli
90e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
90f0: 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47  xSqllog(sqlite3G
9100: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
9110: 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32  logArg, db, 0, 2
9120: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
9130: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
9140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20  connection into 
9150: 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65  a zombie and the
9160: 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f  n close it..  */
9170: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
9180: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42  QLITE_MAGIC_ZOMB
9190: 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61  IE;.  sqlite3Lea
91a0: 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a  veMutexAndCloseZ
91b0: 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74  ombie(db);.  ret
91c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
91d0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69  ../*.** Two vari
91e0: 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75  ations on the pu
91f0: 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66  blic interface f
9200: 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74  or closing a dat
9210: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
9220: 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33  ion. The sqlite3
9230: 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e  _close() version
9240: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
9250: 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76  BUSY and.** leav
9260: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
9270: 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72  n option if ther
9280: 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65  e are unfinalize
9290: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
92a0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
92b0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
92c0: 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c  ackups.  The sql
92d0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a  ite3_close_v2().
92e0: 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65  ** version force
92f0: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
9300: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d   to become a zom
9310: 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65  bie if there are
9320: 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73  .** unclosed res
9330: 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61  ources, and arra
9340: 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63  nges for dealloc
9350: 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c  ation when the l
9360: 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73  ast.** prepare s
9370: 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69  tatement or sqli
9380: 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65  te3_backup close
9390: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
93a0: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
93b0: 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  *db){ return sql
93c0: 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b  ite3Close(db,0);
93d0: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63   }.int sqlite3_c
93e0: 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20  lose_v2(sqlite3 
93f0: 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  *db){ return sql
9400: 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b  ite3Close(db,1);
9410: 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65   }.../*.** Close
9420: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   the mutex on da
9430: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9440: 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74  n db..**.** Furt
9450: 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61  hermore, if data
9460: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9470: 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28  db is a zombie (
9480: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
9490: 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61  re.** has been a
94a0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
94b0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
94c0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   or sqlite3_clos
94d0: 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a  e_v2(db)) and.**
94e0: 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73   every sqlite3_s
94f0: 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e  tmt has now been
9500: 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65   finalized and e
9510: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63  very sqlite3_bac
9520: 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73  kup has.** finis
9530: 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61  hed, then free a
9540: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ll resources..*/
9550: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61  .void sqlite3Lea
9560: 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a  veMutexAndCloseZ
9570: 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ombie(sqlite3 *d
9580: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
9590: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
95a0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
95b0: 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  ble iterator */.
95c0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49    int j;..  /* I
95d0: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
95e0: 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f  tanding sqlite3_
95f0: 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  stmt or sqlite3_
9600: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20  backup objects. 
9610: 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f   ** or if the co
9620: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nnection has not
9630: 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64   yet been closed
9640: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   by sqlite3_clos
9650: 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65  e_v2(),.  ** the
9660: 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65  n just leave the
9670: 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72   mutex and retur
9680: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  n..  */.  if( db
9690: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
96a0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20  MAGIC_ZOMBIE || 
96b0: 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79  connectionIsBusy
96c0: 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  (db) ){.    sqli
96d0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
96e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
96f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
9700: 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
9710: 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
9720: 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ns that the data
9730: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9740: 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20  has.  ** closed 
9750: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  all sqlite3_stmt
9760: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63   and sqlite3_bac
9770: 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20  kup objects and 
9780: 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61  has been.  ** pa
9790: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ssed to sqlite3_
97a0: 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74  close (meaning t
97b0: 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62  hat it is a zomb
97c0: 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  ie).  Therefore,
97d0: 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
97e0: 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  nd free all reso
97f0: 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  urces..  */..  /
9800: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
9810: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c  on is open, roll
9820: 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61   it back. This a
9830: 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74  lso ensures that
9840: 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74   if.  ** any dat
9850: 61 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61  abase schemas ha
9860: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
9870: 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74   by an uncommitt
9880: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ed transaction. 
9890: 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73   ** they are res
98a0: 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65  et. And that the
98b0: 20 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65   required b-tree
98c0: 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74   mutex is held t
98d0: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20  o make.  ** the 
98e0: 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61  pager rollback a
98f0: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20  nd schema reset 
9900: 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74  an atomic operat
9910: 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion. */.  sqlite
9920: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
9930: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20   SQLITE_OK);..  
9940: 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73  /* Free any outs
9950: 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e  tanding Savepoin
9960: 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f  t structures. */
9970: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  .  sqlite3CloseS
9980: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a  avepoints(db);..
9990: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64    /* Close all d
99a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
99b0: 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  ons */.  for(j=0
99c0: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
99d0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
99e0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
99f0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [j];.    if( pDb
9a00: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ->pBt ){.      s
9a10: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
9a20: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
9a30: 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a    pDb->pBt = 0;.
9a40: 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29        if( j!=1 )
9a50: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  {.        pDb->p
9a60: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
9a70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9a80: 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d  /* Clear the TEM
9a90: 50 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74  P schema separat
9aa0: 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a  ely and last */.
9ab0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
9ac0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
9ad0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
9ae0: 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ar(db->aDb[1].pS
9af0: 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71  chema);.  }.  sq
9b00: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
9b10: 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46  ist(db);..  /* F
9b20: 72 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79  ree up the array
9b30: 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61   of auxiliary da
9b40: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c  tabases */.  sql
9b50: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
9b60: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20  baseArray(db);. 
9b70: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
9b80: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
9b90: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
9ba0: 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a  bStatic );..  /*
9bb0: 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69   Tell the code i
9bc0: 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20  n notify.c that 
9bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  the connection n
9be0: 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61  o longer holds a
9bf0: 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e  ny.  ** locks an
9c00: 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  d does not requi
9c10: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75  re any further u
9c20: 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
9c30: 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73  lbacks..  */.  s
9c40: 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
9c50: 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66  Closed(db);..  f
9c60: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9c70: 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29  irst(&db->aFunc)
9c80: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9c90: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46  hNext(i)){.    F
9ca0: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
9cb0: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
9cc0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9cd0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e 63    do{.      func
9ce0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
9cf0: 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  p);.      pNext 
9d00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9d10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9d20: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20  db, p);.      p 
9d30: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68  = pNext;.    }wh
9d40: 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20 20  ile( p );.  }.  
9d50: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9d60: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20  (&db->aFunc);.  
9d70: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9d80: 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  First(&db->aColl
9d90: 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  Seq); i; i=sqlit
9da0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9db0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9dc0: 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73  l = (CollSeq *)s
9dd0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
9de0: 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ;.    /* Invoke 
9df0: 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20  any destructors 
9e00: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63  registered for c
9e10: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9e20: 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a  e user data. */.
9e30: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
9e40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9e50: 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20  ( pColl[j].xDel 
9e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
9e70: 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a  [j].xDel(pColl[j
9e80: 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ].pUser);.      
9e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9ea0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
9eb0: 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  oll);.  }.  sqli
9ec0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
9ed0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
9ee0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9ef0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9f00: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9f10: 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75  First(&db->aModu
9f20: 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  le); i; i=sqlite
9f30: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9f40: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
9f50: 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74   (Module *)sqlit
9f60: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9f70: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73    if( pMod->xDes
9f80: 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d  troy ){.      pM
9f90: 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f  od->xDestroy(pMo
9fa0: 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a  d->pAux);.    }.
9fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45      sqlite3VtabE
9fc0: 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65  ponymousTableCle
9fd0: 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20  ar(db, pMod);.  
9fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9ff0: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
a000: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
a010: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
a020: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
a030: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
a040: 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c  TE_OK); /* Deall
a050: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
a060: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
a070: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   */.  sqlite3Val
a080: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
a090: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  ;.  sqlite3Close
a0a0: 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
a0b0: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
a0c0: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
a0d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a0e0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72  ->auth.zAuthUser
a0f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
a100: 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  e(db->auth.zAuth
a110: 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  PW);.#endif..  d
a120: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
a130: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
a140: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
a150: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
a160: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
a170: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
a180: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
a190: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
a1a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a1b0: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
a1c0: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
a1d0: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
a1e0: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
a1f0: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
a200: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
a210: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
a220: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
a230: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
a240: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
a250: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
a260: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
a270: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
a280: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
a290: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
a2a0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
a2b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a2c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
a2d0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
a2e0: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
a2f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
a300: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
a310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a320: 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64  3LookasideUsed(d
a330: 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  b,0)==0 );.  if(
a340: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
a350: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
a360: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
a370: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
a380: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
a390: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
a3a0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
a3b0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
a3c0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
a3d0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
a3e0: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69   then.** any wri
a3f0: 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  te cursors are i
a400: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
a410: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
a420: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
a430: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
a440: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
a450: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
a460: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
a470: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
a480: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
a490: 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72  or.  Read cursor
a4a0: 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e  s remain open an
a4b0: 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61  d valid.** but a
a4c0: 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61  re "saved" in ca
a4d0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67  se the table pag
a4e0: 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f  es are moved aro
a4f0: 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  und..*/.void sql
a500: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
a510: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a520: 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
a530: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
a540: 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63  ns = 0;.  int sc
a550: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73  hemaChange;.  as
a560: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a570: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
a580: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
a590: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a5a0: 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  c();..  /* Obtai
a5b0: 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74  n all b-tree mut
a5c0: 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69  exes before maki
a5d0: 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  ng any calls to 
a5e0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e  BtreeRollback().
a5f0: 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69   .  ** This is i
a600: 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65  mportant in case
a610: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a620: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
a630: 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69  ck has.  ** modi
a640: 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
a650: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65  e schema. If the
a660: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a670: 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20  are not taken.  
a680: 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e  ** here, then an
a690: 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
a6a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69  he connection mi
a6b0: 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74  ght sneak in bet
a6c0: 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61  ween.  ** the da
a6d0: 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20  tabase rollback 
a6e0: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
a6f0: 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73  , which can caus
a700: 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72  e false.  ** cor
a710: 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20  ruption reports 
a720: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20  in some cases.  
a730: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a740: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
a750: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20   schemaChange = 
a760: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
a770: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
a780: 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  nge)!=0 && db->i
a790: 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20  nit.busy==0;..  
a7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
a7b0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
a7c0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
a7d0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
a7e0: 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   p ){.      if( 
a7f0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
a800: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
a810: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b      inTrans = 1;
a820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a830: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a840: 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ack(p, tripCode,
a850: 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b   !schemaChange);
a860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a870: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
a880: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
a890: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a8a0: 3b 0a 0a 20 20 69 66 28 20 73 63 68 65 6d 61 43  ;..  if( schemaC
a8b0: 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  hange ){.    sql
a8c0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
a8d0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
a8e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a8f0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
a900: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
a910: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
a920: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
a930: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
a940: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
a950: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
a960: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
a970: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
a980: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
a990: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
a9a0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
a9b0: 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53  flags &= ~(u64)S
a9c0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a9d0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a9e0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a9f0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
aa00: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
aa10: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
aa20: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
aa30: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
aa40: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
aa50: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
aa60: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
aa70: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
aa80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
aa90: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
aaa0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
aab0: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
aac0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
aad0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
aae0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
aaf0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
ab00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
ab10: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
ab20: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
ab30: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
ab40: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
ab50: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
ab60: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
ab70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
ab80: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
ab90: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
aba0: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
abb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
abc0: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
abd0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
abe0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
abf0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
ac00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac10: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
ac20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ac30: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ac50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac60: 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50 53  LITE_ERROR_SNAPS
ac70: 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  HOT:     zName =
ac80: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53   "SQLITE_ERROR_S
ac90: 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 62 72 65  NAPSHOT";    bre
aca0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
acb0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20  QLITE_INTERNAL: 
acc0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
acd0: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  = "SQLITE_INTERN
ace0: 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  AL";          br
acf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad00: 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20  SQLITE_PERM:    
ad10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ad20: 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22   = "SQLITE_PERM"
ad30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad50: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20   SQLITE_ABORT:  
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ad70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
ad80: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  T";             
ad90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ada0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
adb0: 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61  OLLBACK:     zNa
adc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
add0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20  RT_ROLLBACK";   
ade0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
adf0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
ae10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
ae20: 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SY";            
ae30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae40: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
ae50: 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a  RECOVERY:      z
ae60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
ae70: 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20  USY_RECOVERY";  
ae80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae90: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
aea0: 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20  _SNAPSHOT:      
aeb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aec0: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20  BUSY_SNAPSHOT"; 
aed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aee0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
aef0: 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20  KED:            
af00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af10: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20  _LOCKED";       
af20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
af40: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
af50: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
af60: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
af70: 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20  ACHE";break;.   
af80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
af90: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20  OMEM:           
afa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
afb0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
afc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
afd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
afe0: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20  READONLY:       
aff0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b000: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20  ITE_READONLY";  
b010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b020: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b030: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
b040: 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  RY:  zName = "SQ
b050: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
b060: 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a  COVERY"; break;.
b070: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b080: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
b090: 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  NIT:  zName = "S
b0a0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
b0b0: 41 4e 54 49 4e 49 54 22 3b 20 62 72 65 61 6b 3b  ANTINIT"; break;
b0c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b0d0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
b0e0: 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  BACK:  zName = "
b0f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b100: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
b110: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b120: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
b130: 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OVED:   zName = 
b140: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b150: 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61  _DBMOVED";  brea
b160: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b170: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49  LITE_READONLY_DI
b180: 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d  RECTORY: zName =
b190: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b1a0: 59 5f 44 49 52 45 43 54 4f 52 59 22 3b 62 72 65  Y_DIRECTORY";bre
b1b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b1c0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
b1d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b1e0: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
b1f0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
b200: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b210: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
b220: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b230: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b240: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
b250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b260: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
b270: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
b280: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b290: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
b2a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b2b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b2c0: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
b2d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b2e0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
b2f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b300: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b310: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
b320: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b330: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
b340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b350: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b360: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
b370: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b380: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
b390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b3a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b3b0: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
b3c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b3d0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
b3e0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b3f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b400: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
b410: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b420: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
b430: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
b440: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b450: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
b460: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b470: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
b480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b4a0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
b4b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b4c0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
b4d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b4e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b4f0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
b500: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b510: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
b520: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b530: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b540: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
b550: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b560: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b570: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
b580: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b590: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
b5a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b5b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
b5c0: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
b5d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b5e0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a  TE_IOERR_ACCESS:
b5f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b600: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
b610: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
b620: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b630: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b640: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b670: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b680: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
b690: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
b6a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6b0: 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20  IOERR_LOCK:     
b6c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b6d0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b  ITE_IOERR_LOCK";
b6e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b6f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b700: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20  _IOERR_CLOSE:   
b710: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b720: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
b730: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b740: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b750: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b760: 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  E:    zName = "S
b770: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b780: 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b  CLOSE";   break;
b790: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7a0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b7b0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b7c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b7d0: 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  OPEN";     break
b7e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b7f0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b800: 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  E:      zName = 
b810: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b820: 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61  MSIZE";     brea
b830: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b840: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b850: 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  CK:      zName =
b860: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b870: 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65  HMLOCK";     bre
b880: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b890: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b8a0: 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AP:       zName 
b8b0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b8c0: 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72  SHMMAP";      br
b8d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b8f0: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b900: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b910: 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62  _SEEK";        b
b920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b930: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b940: 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d  LETE_NOENT: zNam
b950: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b960: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b  R_DELETE_NOENT";
b970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b980: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  e SQLITE_IOERR_M
b990: 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  MAP:         zNa
b9a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b9b0: 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20  RR_MMAP";       
b9c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9d0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b9e0: 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e  GETTEMPPATH:  zN
b9f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ba00: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22  ERR_GETTEMPPATH"
ba10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ba20: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ba30: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a  _CONVPATH:     z
ba40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ba50: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OERR_CONVPATH"; 
ba60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ba70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
ba80: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
ba90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
baa0: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
bab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bac0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
bad0: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
bae0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
baf0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
bb00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
bb20: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
bb30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bb40: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
bb50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
bb70: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
bb80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bb90: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
bba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bbb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bbc0: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
bbd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bbe0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
bbf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bc00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bc10: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
bc20: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
bc30: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
bc40: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
bc50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc60: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
bc70: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
bc80: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
bc90: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
bca0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bcb0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
bcc0: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
bcd0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bce0: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
bcf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd00: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
bd10: 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  VPATH:  zName = 
bd20: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
bd30: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61  _CONVPATH"; brea
bd40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bd50: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
bd60: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bd70: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
bd80: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
bd90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bda0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
bdb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bdc0: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
bdd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bde0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bdf0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
be00: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be10: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
be20: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            b
be30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be40: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
be50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
be60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
be70: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
be80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be90: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bea0: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
beb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bec0: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
bed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bee0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bef0: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
bf00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bf10: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
bf20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
bf30: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bf40: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
bf50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf60: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
bf70: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
bf80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bf90: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
bfa0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bfd0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
bfe0: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
bff0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c000: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c010: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
c020: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c030: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
c040: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c050: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c060: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c090: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c0a0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
c0b0: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
c0c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c0d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
c0e0: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
c0f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c100: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
c110: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c120: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
c130: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c160: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c170: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
c180: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c190: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c1a0: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
c1b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c1c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
c1d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c1e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c1f0: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
c200: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c230: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c240: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
c250: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c260: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c270: 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  ROWID:   zName =
c280: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c290: 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65  INT_ROWID";  bre
c2a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c2b0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
c2c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c2d0: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  = "SQLITE_MISMAT
c2e0: 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  CH";          br
c2f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c300: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20  SQLITE_MISUSE:  
c310: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c320: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53   = "SQLITE_MISUS
c330: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
c340: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c350: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20   SQLITE_NOLFS:  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c370: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46  e = "SQLITE_NOLF
c380: 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S";             
c390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c3a0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c3c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54  me = "SQLITE_AUT
c3d0: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
c3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c3f0: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
c400: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c410: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
c420: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
c430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c440: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
c450: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
c460: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
c470: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
c480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c490: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
c4a0: 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  DB:             
c4b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c4c0: 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20  NOTADB";        
c4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c4e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
c4f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
c500: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c510: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20  _ROW";          
c520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c540: 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20  TICE:           
c550: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c560: 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20  E_NOTICE";      
c570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c580: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c590: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c5a0: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
c5b0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
c5c0: 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  R_WAL";break;.  
c5d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c5e0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
c5f0: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c620: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
c630: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
c640: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
c650: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
c660: 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  ING:            
c670: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c680: 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20  WARNING";       
c690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c6a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
c6b0: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20  NING_AUTOINDEX: 
c6c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c6d0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
c6e0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
c6f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
c700: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
c710: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c720: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
c730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c740: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61   }.  }.  if( zNa
c750: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  me==0 ){.    sta
c760: 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30  tic char zBuf[50
c770: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
c780: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
c790: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c  Buf), zBuf, "SQL
c7a0: 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22  ITE_UNKNOWN(%d)"
c7b0: 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a  , origRc);.    z
c7c0: 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d  Name = zBuf;.  }
c7d0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
c7e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c7f0: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
c800: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
c810: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
c820: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
c830: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
c840: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
c850: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
c860: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
c870: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c880: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
c890: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
c8a0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
c8b0: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
c8c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
c8d0: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
c8e0: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a  L logic error",.
c8f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
c900: 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a  TERNAL    */ 0,.
c910: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45      /* SQLITE_PE
c920: 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63  RM        */ "ac
c930: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
c940: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
c950: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20  SQLITE_ABORT    
c960: 20 20 20 2a 2f 20 22 71 75 65 72 79 20 61 62 6f     */ "query abo
c970: 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rted",.    /* SQ
c980: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
c990: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
c9a0: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
c9b0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
c9c0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c9d0: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
c9e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c9f0: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
ca00: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
ca10: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
ca20: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
ca30: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ca40: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
ca50: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
ca60: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
ca70: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
ca80: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ca90: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
caa0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
cab0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
cac0: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
cad0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
cae0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
caf0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cb00: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
cb10: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
cb20: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
cb30: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
cb40: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
cb50: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
cb60: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
cb70: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
cb80: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
cb90: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
cba0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
cbb0: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
cbc0: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
cbd0: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
cbe0: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
cbf0: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
cc00: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
cc10: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
cc20: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
cc30: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
cc40: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
cc50: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
cc60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
cc70: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
cc80: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
cc90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
cca0: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
ccb0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
ccc0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ccd0: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
cce0: 62 61 64 20 70 61 72 61 6d 65 74 65 72 20 6f 72  bad parameter or
ccf0: 20 6f 74 68 65 72 20 41 50 49 20 6d 69 73 75 73   other API misus
cd00: 65 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e",.#ifdef SQLIT
cd10: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20  E_DISABLE_LFS.  
cd20: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46    /* SQLITE_NOLF
cd30: 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67  S       */ "larg
cd40: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
cd50: 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c  s disabled",.#el
cd60: 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  se.    /* SQLITE
cd70: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
cd80: 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  0,.#endif.    /*
cd90: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
cda0: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
cdb0: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
cdc0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
cdd0: 4d 41 54 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  MAT      */ 0,. 
cde0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
cdf0: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c  GE       */ "col
ce00: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
ce10: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
ce20: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
ce30: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e     */ "file is n
ce40: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
ce50: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
ce60: 54 49 43 45 20 20 20 20 20 20 2a 2f 20 22 6e 6f  TICE      */ "no
ce70: 74 69 66 69 63 61 74 69 6f 6e 20 6d 65 73 73 61  tification messa
ce80: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
ce90: 54 45 5f 57 41 52 4e 49 4e 47 20 20 20 20 20 2a  TE_WARNING     *
cea0: 2f 20 22 77 61 72 6e 69 6e 67 20 6d 65 73 73 61  / "warning messa
ceb0: 67 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73  ge",.  };.  cons
cec0: 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
ced0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a  unknown error";.
cee0: 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a    switch( rc ){.
cef0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cf00: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
cf10: 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22  {.      zErr = "
cf20: 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c  abort due to ROL
cf30: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72  LBACK";.      br
cf40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cf50: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
cf60: 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22  {.      zErr = "
cf70: 61 6e 6f 74 68 65 72 20 72 6f 77 20 61 76 61 69  another row avai
cf80: 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72  lable";.      br
cf90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cfa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
cfb0: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
cfc0: 22 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20 61 76  "no more rows av
cfd0: 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20 20  ailable";.      
cfe0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cff0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
d000: 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20    rc &= 0xff;.  
d010: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72      if( ALWAYS(r
d020: 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61  c>=0) && rc<Arra
d030: 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61  ySize(aMsg) && a
d040: 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20  Msg[rc]!=0 ){.  
d050: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73        zErr = aMs
d060: 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  g[rc];.      }. 
d070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d080: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
d090: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Err;.}../*.** Th
d0a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
d0b0: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
d0c0: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
d0d0: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
d0e0: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
d0f0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
d100: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
d110: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
d120: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
d130: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
d140: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
d150: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
d160: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
d170: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72  rn non-zero to r
d180: 65 74 72 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  etry the lock.  
d190: 52 65 74 75 72 6e 20 7a 65 72 6f 20 74 6f 20 73  Return zero to s
d1a0: 74 6f 70 20 74 72 79 69 6e 67 0a 2a 2a 20 61 6e  top trying.** an
d1b0: 64 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74  d cause SQLite t
d1c0: 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
d1d0: 42 55 53 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  BUSY..*/.static 
d1e0: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
d1f0: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
d200: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
d210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
d220: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d230: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 2c   */.  int count,
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d250: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
d260: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
d270: 20 62 75 73 79 20 2a 2f 0a 20 20 73 71 6c 69 74   busy */.  sqlit
d280: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 20  e3_file *pFile  
d290: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
d2a0: 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63  on which the loc
d2b0: 6b 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  k occurred */.){
d2c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d2d0: 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45  IN || HAVE_USLEE
d2e0: 50 0a 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65  P.  /* This case
d2f0: 20 69 73 20 66 6f 72 20 73 79 73 74 65 6d 73 20   is for systems 
d300: 74 68 61 74 20 68 61 76 65 20 73 75 70 70 6f 72  that have suppor
d310: 74 20 66 6f 72 20 73 6c 65 65 70 69 6e 67 20 66  t for sleeping f
d320: 6f 72 20 66 72 61 63 74 69 6f 6e 73 20 6f 66 0a  or fractions of.
d330: 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 2e 20 20    ** a second.  
d340: 45 78 61 6d 70 6c 65 73 3a 20 20 41 6c 6c 20 77  Examples:  All w
d350: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2c 20  indows systems, 
d360: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 77 69 74  unix systems wit
d370: 68 20 75 73 6c 65 65 70 28 29 20 2a 2f 0a 20 20  h usleep() */.  
d380: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
d390: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
d3a0: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
d3b0: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
d3c0: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
d3d0: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
d3e0: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
d3f0: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
d400: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
d410: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
d420: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
d430: 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61  fine NDELAY Arra
d440: 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20  ySize(delays).  
d450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
d460: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
d470: 69 6e 74 20 74 6d 6f 75 74 20 3d 20 64 62 2d 3e  int tmout = db->
d480: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
d490: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
d4a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d4b0: 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d  ENABLE_SETLK_TIM
d4c0: 45 4f 55 54 0a 20 20 69 66 28 20 73 71 6c 69 74  EOUT.  if( sqlit
d4d0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
d4e0: 70 46 69 6c 65 2c 53 51 4c 49 54 45 5f 46 43 4e  pFile,SQLITE_FCN
d4f0: 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  TL_LOCK_TIMEOUT,
d500: 26 74 6d 6f 75 74 29 3d 3d 53 51 4c 49 54 45 5f  &tmout)==SQLITE_
d510: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  OK ){.    if( co
d520: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 74 6d 6f  unt ){.      tmo
d530: 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ut = 0;.      sq
d540: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
d550: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
d560: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45  _FCNTL_LOCK_TIME
d570: 4f 55 54 2c 20 26 74 6d 6f 75 74 29 3b 0a 20 20  OUT, &tmout);.  
d580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d5a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
d5b0: 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
d5c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46 69 6c  D_PARAMETER(pFil
d5d0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  e);.#endif.  ass
d5e0: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
d5f0: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
d600: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
d610: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
d620: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
d630: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
d640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
d650: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
d660: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
d670: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
d680: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
d690: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
d6a0: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
d6b0: 20 64 65 6c 61 79 20 3e 20 74 6d 6f 75 74 20 29   delay > tmout )
d6c0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 6d  {.    delay = tm
d6d0: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
d6e0: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
d6f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d700: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
d710: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
d720: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d730: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54 68 69  ;.#else.  /* Thi
d740: 73 20 63 61 73 65 20 66 6f 72 20 75 6e 69 78 20  s case for unix 
d750: 73 79 73 74 65 6d 73 20 74 68 61 74 20 6c 61 63  systems that lac
d760: 6b 20 75 73 6c 65 65 70 28 29 20 73 75 70 70 6f  k usleep() suppo
d770: 72 74 2e 20 20 53 6c 65 65 70 69 6e 67 0a 20 20  rt.  Sleeping.  
d780: 2a 2a 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  ** must be done 
d790: 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66  in increments of
d7a0: 20 77 68 6f 6c 65 20 73 65 63 6f 6e 64 73 20 2a   whole seconds *
d7b0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
d7c0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
d7d0: 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20  ;.  int tmout = 
d7e0: 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29  ((sqlite3 *)ptr)
d7f0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
d800: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d810: 52 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  R(pFile);.  if( 
d820: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
d830: 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20 72 65   tmout ){.    re
d840: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
d850: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
d860: 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b  >pVfs, 1000000);
d870: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
d880: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  dif.}../*.** Inv
d890: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75  oke the given bu
d8a0: 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a  sy handler..**.*
d8b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d8c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
d8d0: 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65   operation faile
d8e0: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 0a 2a  d to acquire a.*
d8f0: 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46 53 20 66 69  * lock on VFS fi
d900: 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  le pFile..**.** 
d910: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
d920: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
d930: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
d940: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
d950: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
d960: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
d970: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
d980: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
d990: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
d9a0: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
d9b0: 48 61 6e 64 6c 65 72 20 2a 70 2c 20 73 71 6c 69  Handler *p, sqli
d9c0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
d9d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
d9e0: 28 20 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ( p->xBusyHandle
d9f0: 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  r==0 || p->nBusy
da00: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
da10: 20 69 66 28 20 70 2d 3e 62 45 78 74 72 61 46 69   if( p->bExtraFi
da20: 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 2f 2a 20  leArg ){.    /* 
da30: 41 64 64 20 61 6e 20 65 78 74 72 61 20 70 61 72  Add an extra par
da40: 61 6d 65 74 65 72 20 77 69 74 68 20 74 68 65 20  ameter with the 
da50: 70 46 69 6c 65 20 70 6f 69 6e 74 65 72 20 74 6f  pFile pointer to
da60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
da70: 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20      ** callback 
da80: 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  argument list */
da90: 0a 20 20 20 20 69 6e 74 20 28 2a 78 54 72 61 29  .    int (*xTra)
daa0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74  (void*,int,sqlit
dab0: 65 33 5f 66 69 6c 65 2a 29 3b 0a 20 20 20 20 78  e3_file*);.    x
dac0: 54 72 61 20 3d 20 28 69 6e 74 28 2a 29 28 76 6f  Tra = (int(*)(vo
dad0: 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  id*,int,sqlite3_
dae0: 66 69 6c 65 2a 29 29 70 2d 3e 78 42 75 73 79 48  file*))p->xBusyH
daf0: 61 6e 64 6c 65 72 3b 0a 20 20 20 20 72 63 20 3d  andler;.    rc =
db00: 20 78 54 72 61 28 70 2d 3e 70 42 75 73 79 41 72   xTra(p->pBusyAr
db10: 67 2c 20 70 2d 3e 6e 42 75 73 79 2c 20 70 46 69  g, p->nBusy, pFi
db20: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
db30: 20 20 2f 2a 20 4c 65 67 61 63 79 20 73 74 79 6c    /* Legacy styl
db40: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63  e busy handler c
db50: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 72  allback */.    r
db60: 63 20 3d 20 70 2d 3e 78 42 75 73 79 48 61 6e 64  c = p->xBusyHand
db70: 6c 65 72 28 70 2d 3e 70 42 75 73 79 41 72 67 2c  ler(p->pBusyArg,
db80: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 7d 0a   p->nBusy);.  }.
db90: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
dba0: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
dbb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dbc0: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
dbd0: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
dbe0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
dbf0: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
dc00: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
dc10: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
dc20: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
dc30: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
dc40: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
dc50: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
dc60: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
dc70: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
dc80: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
dc90: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
dca0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
dcb0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
dcc0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
dcd0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
dce0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
dcf0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
dd00: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
dd10: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
dd20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
dd30: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
dd40: 73 79 48 61 6e 64 6c 65 72 2e 78 42 75 73 79 48  syHandler.xBusyH
dd50: 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 3b 0a  andler = xBusy;.
dd60: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
dd70: 72 2e 70 42 75 73 79 41 72 67 20 3d 20 70 41 72  r.pBusyArg = pAr
dd80: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
dd90: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
dda0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
ddb0: 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67 20  r.bExtraFileArg 
ddc0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54  = 0;.  db->busyT
ddd0: 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71  imeout = 0;.  sq
dde0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ddf0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
de00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
de10: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
de20: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
de30: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
de40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
de50: 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ts the progress 
de60: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
de70: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
de80: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
de90: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
dea0: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
deb0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70   argument. The p
dec0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
ded0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f   will.** be invo
dee0: 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f  ked every nOps o
def0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  pcodes..*/.void 
df00: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
df10: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
df20: 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
df30: 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50  nOps,.  int (*xP
df40: 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c  rogress)(void*),
df50: 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29   .  void *pArg.)
df60: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
df70: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
df80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
df90: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
dfa0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
dfb0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
dfc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
dfd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
dfe0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dff0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
e000: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
e010: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
e020: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
e030: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
e040: 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b   (unsigned)nOps;
e050: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
e060: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
e070: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
e080: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
e090: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
e0a0: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
e0b0: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
e0c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
e0d0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e0e0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
e0f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
e100: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
e110: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
e120: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
e130: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
e140: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
e150: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
e160: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
e170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e180: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
e190: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
e1a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e1b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e1c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e1d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e1e0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
e1f0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
e200: 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30  endif.  if( ms>0
e210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e220: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
e230: 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c 69   (int(*)(void*,i
e240: 6e 74 29 29 73 71 6c 69 74 65 44 65 66 61 75 6c  nt))sqliteDefaul
e250: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 0a 20  tBusyCallback,. 
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
e280: 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  d*)db);.    db->
e290: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
e2a0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61  ;.    db->busyHa
e2b0: 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65  ndler.bExtraFile
e2c0: 41 72 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Arg = 1;.  }else
e2d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
e2e0: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
e2f0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
e300: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e310: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
e320: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
e330: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
e340: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
e350: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
e360: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
e370: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
e380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e390: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e3a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e3b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 26  etyCheckOk(db) &
e3c0: 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  & (db==0 || db->
e3d0: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
e3e0: 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a 20  GIC_ZOMBIE) ){. 
e3f0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e400: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e410: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
e420: 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49  dif.  db->u1.isI
e430: 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a  nterrupted = 1;.
e440: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
e450: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74  unction is exact
e460: 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ly the same as s
e470: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e480: 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74  nction(), except
e490: 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64  .** that it is d
e4a0: 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61  esigned to be ca
e4b0: 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c  lled by internal
e4c0: 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65   code. The diffe
e4d0: 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74  rence is.** that
e4e0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
e4f0: 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f  ails in sqlite3_
e500: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e510: 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ), an error code
e520: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
e530: 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  and the mallocFa
e540: 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65  iled flag cleare
e550: 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
e560: 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20  e3CreateFunc(.  
e570: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
e580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
e590: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
e5a0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
e5b0: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
e5c0: 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  ta,.  void (*xSF
e5d0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
e5e0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e5f0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
e600: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
e610: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e620: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e630: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
e640: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
e650: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
e660: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
e670: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
e680: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
e690: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e6a0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e6b0: 75 65 20 2a 2a 29 2c 0a 20 20 46 75 6e 63 44 65  ue **),.  FuncDe
e6c0: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
e6d0: 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44  uctor.){.  FuncD
e6e0: 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61  ef *p;.  int nNa
e6f0: 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46  me;.  int extraF
e700: 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  lags;..  assert(
e710: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e720: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
e730: 3b 0a 20 20 61 73 73 65 72 74 28 20 78 56 61 6c  ;.  assert( xVal
e740: 75 65 3d 3d 30 20 7c 7c 20 78 53 46 75 6e 63 3d  ue==0 || xSFunc=
e750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  =0 );.  if( zFun
e760: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 20 20 20  ctionName==0    
e770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
e780: 75 73 74 20 68 61 76 65 20 61 20 76 61 6c 69 64  ust have a valid
e790: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c 7c 20 28   name */.   || (
e7a0: 78 53 46 75 6e 63 21 3d 30 20 26 26 20 78 46 69  xSFunc!=0 && xFi
e7b0: 6e 61 6c 21 3d 30 29 20 20 20 20 20 20 20 20 2f  nal!=0)        /
e7c0: 2a 20 4e 6f 74 20 62 6f 74 68 20 78 53 46 75 6e  * Not both xSFun
e7d0: 63 20 61 6e 64 20 78 46 69 6e 61 6c 20 2a 2f 0a  c and xFinal */.
e7e0: 20 20 20 7c 7c 20 28 28 78 46 69 6e 61 6c 3d 3d     || ((xFinal==
e7f0: 30 29 21 3d 28 78 53 74 65 70 3d 3d 30 29 29 20  0)!=(xStep==0)) 
e800: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72        /* Both or
e810: 20 6e 65 69 74 68 65 72 20 6f 66 20 78 46 69 6e   neither of xFin
e820: 61 6c 20 61 6e 64 20 78 53 74 65 70 20 2a 2f 0a  al and xStep */.
e830: 20 20 20 7c 7c 20 28 28 78 56 61 6c 75 65 3d 3d     || ((xValue==
e840: 30 29 21 3d 28 78 49 6e 76 65 72 73 65 3d 3d 30  0)!=(xInverse==0
e850: 29 29 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ))    /* Both or
e860: 20 6e 65 69 74 68 65 72 20 6f 66 20 78 56 61 6c   neither of xVal
e870: 75 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a  ue, xInverse */.
e880: 20 20 20 7c 7c 20 28 6e 41 72 67 3c 2d 31 20 7c     || (nArg<-1 |
e890: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
e8a0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 0a  X_FUNCTION_ARG).
e8b0: 20 20 20 7c 7c 20 28 32 35 35 3c 28 6e 4e 61 6d     || (255<(nNam
e8c0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e8d0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
e8e0: 6d 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  me))).  ){.    r
e8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
e900: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
e910: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e920: 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53  FUNC_CONSTANT==S
e930: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
e940: 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c  TIC );.  extraFl
e950: 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c  ags = enc &  SQL
e960: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
e970: 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c  C;.  enc &= (SQL
e980: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
e990: 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20  |SQLITE_ANY);.  
e9a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e9b0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
e9c0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
e9d0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
e9e0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
e9f0: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
ea00: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
ea10: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
ea20: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
ea30: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
ea40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ea50: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
ea60: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
ea70: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
ea80: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
ea90: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
eaa0: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
eab0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
eac0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
ead0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
eae0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
eaf0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
eb00: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
eb10: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
eb20: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
eb30: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
eb40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
eb50: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
eb60: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
eb70: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
eb80: 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46  LITE_UTF8|extraF
eb90: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70  lags,.         p
eba0: 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63  UserData, xSFunc
ebb0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
ebc0: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
ebd0: 65 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  e, pDestructor);
ebe0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ebf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ec00: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
ec10: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
ec20: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
ec30: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65  SQLITE_UTF16LE|e
ec40: 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20  xtraFlags,.     
ec50: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
ec60: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
ec70: 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78  Final, xValue, x
ec80: 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75  Inverse, pDestru
ec90: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
eca0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ecb0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
ecc0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
ecd0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
ece0: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
ecf0: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
ed00: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
ed10: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
ed20: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
ed30: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
ed40: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
ed50: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
ed60: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
ed70: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
ed80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
ed90: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
eda0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
edb0: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
edc0: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
edd0: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
ede0: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
edf0: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
ee00: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
ee10: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
ee20: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
ee30: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
ee40: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
ee50: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ee60: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
ee70: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70  );.  if( p && (p
ee80: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
ee90: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
eea0: 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20 26 26 20  K)==(u32)enc && 
eeb0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
eec0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
eed0: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
eee0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
eef0: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
ef00: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
ef10: 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
ef20: 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75  e/modify user-fu
ef30: 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63  nction due to ac
ef40: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
ef50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ef60: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ef70: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
ef80: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
ef90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
efa0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
efb0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
efc0: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  (db, 0);.    }. 
efd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
efe0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
eff0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
f000: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
f010: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
f020: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
f030: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
f040: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f050: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f060: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f   }..  /* If an o
f070: 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20  lder version of 
f080: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  the function wit
f090: 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64  h a configured d
f0a0: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a  estructor is.  *
f0b0: 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  * being replaced
f0c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
f0d0: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
f0e0: 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74  here. */.  funct
f0f0: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
f100: 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72  );..  if( pDestr
f110: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
f120: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b  structor->nRef++
f130: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65  ;.  }.  p->u.pDe
f140: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
f150: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e  ructor;.  p->fun
f160: 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e  cFlags = (p->fun
f170: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
f180: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20  FUNC_ENCMASK) | 
f190: 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65  extraFlags;.  te
f1a0: 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46  stcase( p->funcF
f1b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45  lags & SQLITE_DE
f1c0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
f1d0: 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53 46   p->xSFunc = xSF
f1e0: 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20 78  unc ? xSFunc : x
f1f0: 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61  Step;.  p->xFina
f200: 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20  lize = xFinal;. 
f210: 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20 78 56 61   p->xValue = xVa
f220: 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e 76 65 72  lue;.  p->xInver
f230: 73 65 20 3d 20 78 49 6e 76 65 72 73 65 3b 0a 20  se = xInverse;. 
f240: 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20   p->pUserData = 
f250: 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e  pUserData;.  p->
f260: 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67  nArg = (u16)nArg
f270: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f280: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
f290: 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 75  orker function u
f2a0: 73 65 64 20 62 79 20 75 74 66 2d 38 20 41 50 49  sed by utf-8 API
f2b0: 73 20 74 68 61 74 20 63 72 65 61 74 65 20 6e 65  s that create ne
f2c0: 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  w functions:.**.
f2d0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  **    sqlite3_cr
f2e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 0a  eate_function().
f2f0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  **    sqlite3_cr
f300: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
f310: 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ().**    sqlite3
f320: 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66  _create_window_f
f330: 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a 73 74 61  unction().*/.sta
f340: 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 46 75  tic int createFu
f350: 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20 73 71 6c  nctionApi(.  sql
f360: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f370: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
f380: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
f390: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
f3a0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
f3b0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f3c0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
f3d0: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
f3e0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
f3f0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
f400: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
f410: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
f420: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f430: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56 61  *),.  void (*xVa
f440: 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lue)(sqlite3_con
f450: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
f460: 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69 74  *xInverse)(sqlit
f470: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f480: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
f490: 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 74 72  ,.  void(*xDestr
f4a0: 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  oy)(void*).){.  
f4b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f4c0: 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73  ERROR;.  FuncDes
f4d0: 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20  tructor *pArg = 
f4e0: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
f4f0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f500: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f510: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f520: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
f530: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
f540: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
f550: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f560: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f570: 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79  ;.  if( xDestroy
f580: 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28   ){.    pArg = (
f590: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
f5a0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 73  )sqlite3Malloc(s
f5b0: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
f5c0: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
f5d0: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 73  !pArg ){.      s
f5e0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
f5f0: 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73 74 72  b);.      xDestr
f600: 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74  oy(p);.      got
f610: 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  o out;.    }.   
f620: 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20 30 3b   pArg->nRef = 0;
f630: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
f640: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
f650: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
f660: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
f670: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
f680: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
f690: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 0a   nArg, enc, p, .
f6a0: 20 20 20 20 20 20 78 53 46 75 6e 63 2c 20 78 53        xSFunc, xS
f6b0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61  tep, xFinal, xVa
f6c0: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70  lue, xInverse, p
f6d0: 41 72 67 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Arg.  );.  if( p
f6e0: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65  Arg && pArg->nRe
f6f0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
f700: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
f710: 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f  K );.    xDestro
f720: 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  y(p);.    sqlite
f730: 33 5f 66 72 65 65 28 70 41 72 67 29 3b 0a 20 20  3_free(pArg);.  
f740: 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20  }.. out:.  rc = 
f750: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
f760: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
f770: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f780: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f7a0: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
f7b0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
f7c0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
f7d0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
f7e0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f7f0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
f800: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
f810: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
f820: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
f830: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f840: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
f850: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
f860: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
f870: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f880: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
f890: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f8a0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f8b0: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
f8c0: 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41   createFunctionA
f8d0: 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  pi(db, zFunc, nA
f8e0: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75  rg, enc, p, xSFu
f8f0: 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20  nc, xStep,.     
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
f920: 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  Final, 0, 0, 0);
f930: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  .}.int sqlite3_c
f940: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
f950: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
f960: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
f970: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
f980: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
f990: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
f9a0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
f9b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f9c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
f9d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
f9e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f9f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
fa00: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
fa10: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
fa20: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
fa30: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29  void (*xDestroy)
fa40: 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 72 65  (void *).){.  re
fa50: 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74  turn createFunct
fa60: 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63  ionApi(db, zFunc
fa70: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
fa80: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20  xSFunc, xStep,. 
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c     xFinal, 0, 0,
fac0: 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 69 6e   xDestroy);.}.in
fad0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
fae0: 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e  _window_function
faf0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fb00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fb10: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
fb20: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
fb30: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
fb40: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
fb50: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
fb60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
fb70: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
fb80: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fb90: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56 61  *),.  void (*xVa
fba0: 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lue)(sqlite3_con
fbb0: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
fbc0: 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69 74  *xInverse)(sqlit
fbd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
fbe0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fbf0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
fc00: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
fc10: 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65  .  return create
fc20: 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20  FunctionApi(db, 
fc30: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
fc40: 2c 20 70 2c 20 30 2c 20 78 53 74 65 70 2c 0a 20  , p, 0, xStep,. 
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75     xFinal, xValu
fc80: 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 78 44 65  e, xInverse, xDe
fc90: 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69 66 6e 64  stroy);.}..#ifnd
fca0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
fcb0: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
fcc0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
fcd0: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
fce0: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
fcf0: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
fd00: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
fd10: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
fd20: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
fd30: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
fd40: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
fd50: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
fd60: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
fd70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fd80: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fd90: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
fda0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
fdb0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
fdc0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
fdd0: 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  unc8;..#ifdef SQ
fde0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
fdf0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
fe00: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
fe10: 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69  k(db) || zFuncti
fe20: 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  onName==0 ) retu
fe30: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
fe40: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
fe50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fe60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fe70: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
fe80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
fe90: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
fea0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
feb0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
fec0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
fed0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
fee0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
fef0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
ff00: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53   eTextRep, p, xS
ff10: 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61  Func,xStep,xFina
ff20: 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69  l,0,0,0);.  sqli
ff30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
ff40: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
ff50: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
ff60: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
ff70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
ff80: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
ff90: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
ffa0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
ffb0: 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70 6c 65  ing is the imple
ffc0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
ffd0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
ffe0: 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61 69 6c  t always.** fail
fff0: 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  s with an error 
10000 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e 67 20  message stating 
10010 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
10020 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  n is used in the
10030 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74 65 78  .** wrong contex
10040 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  t.  The sqlite3_
10050 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
10060 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20 63 6f  n() API might co
10070 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c 20 66  nstruct.** SQL f
10080 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65  unction that use
10090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 6f   this routine so
100a0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
100b0 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74 0a 2a  ons will exist.*
100c0 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  * for name resol
100d0 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20 61 63  ution but are ac
100e0 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61 64 65  tually overloade
100f0 64 20 62 79 20 74 68 65 20 78 46 69 6e 64 46 75  d by the xFindFu
10100 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68 6f 64  nction.** method
10110 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
10120 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10130 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  id sqlite3Invali
10140 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  dFunction(.  sql
10150 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
10160 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65 20 66  ntext,  /* The f
10170 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20  unction calling 
10180 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
10190 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20   NotUsed,       
101a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
101b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
101c0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
101d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
101e0 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20 20 2f  e **NotUsed2   /
101f0 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68 20  * Value of each 
10200 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
10210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
10220 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
10230 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
10240 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
10250 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
10260 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
10270 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10280 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  2);.  zErr = sql
10290 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
102a0 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 75      "unable to u
102b0 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73 20 69  se function %s i
102c0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
102d0 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d 65 29  context", zName)
102e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
102f0 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
10300 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 73  , zErr, -1);.  s
10310 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
10320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  );.}../*.** Decl
10330 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74  are that a funct
10340 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ion has been ove
10350 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72  rloaded by a vir
10360 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
10370 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
10380 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  n already exists
10390 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c   as a regular gl
103a0 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74  obal function, t
103b0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
103c0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
103d0 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
103e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
103f0 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20   then create.** 
10400 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61  a new one that a
10410 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72  lways throws a r
10420 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20  un-time error.  
10430 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74  .**.** When virt
10440 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e  ual tables inten
10450 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  d to provide an 
10460 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74  overloaded funct
10470 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f  ion, they.** sho
10480 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  uld call this ro
10490 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75  utine to make su
104a0 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  re the global fu
104b0 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a  nction exists..*
104c0 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  * A global funct
104d0 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  ion must exist i
104e0 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65  n order for name
104f0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77   resolution to w
10500 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e  ork.** properly.
10510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10520 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
10530 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
10540 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
10550 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  zName,.  int nAr
10560 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  g.){.  int rc;. 
10570 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 0a 23   char *zCopy;..#
10580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10590 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
105a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
105b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
105c0 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72   zName==0 || nAr
105d0 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  g<-2 ){.    retu
105e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
105f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
10600 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10610 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10620 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  x);.  rc = sqlit
10630 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
10640 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
10650 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 21  SQLITE_UTF8, 0)!
10660 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  =0;.  sqlite3_mu
10670 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10680 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tex);.  if( rc )
10690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
106a0 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c  K;.  zCopy = sql
106b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 4e 61  ite3_mprintf(zNa
106c0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 70 79  me);.  if( zCopy
106d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
106e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 65 74  ITE_NOMEM;.  ret
106f0 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
10700 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
10710 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
10720 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c 20 73          zCopy, s
10750 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
10760 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73 71 6c  ction, 0, 0, sql
10770 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 23  ite3_free);.}..#
10780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10790 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
107a0 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
107b0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
107c0 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
107d0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
107e0 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
107f0 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
10800 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
10810 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
10820 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
10830 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
10840 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
10850 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10860 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
10870 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
10880 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
10890 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
108a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
108b0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
108c0 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ED.void *sqlite3
108d0 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
108e0 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 65  db, void(*xTrace
108f0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
10900 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
10910 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
10920 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10930 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10940 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10950 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10960 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
10970 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10980 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
10990 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
109a0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
109b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
109c0 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
109d0 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63  Arg;.  db->mTrac
109e0 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51 4c  e = xTrace ? SQL
109f0 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43 59  ITE_TRACE_LEGACY
10a00 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61   : 0;.  db->xTra
10a10 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33 32  ce = (int(*)(u32
10a20 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69  ,void*,void*,voi
10a30 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64 62  d*))xTrace;.  db
10a40 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
10a50 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10a60 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10a70 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
10a80 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
10a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10aa0 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52  RECATED */../* R
10ab0 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
10ac0 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74  callback using t
10ad0 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74  he version-2 int
10ae0 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
10af0 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28  qlite3_trace_v2(
10b00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b30 20 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e   Trace this conn
10b40 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  ection */.  unsi
10b50 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20 20  gned mTrace,    
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
10b80 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20 74  f events to be t
10b90 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a  raced */.  int(*
10ba0 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64  xTrace)(unsigned
10bb0 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69  ,void*,void*,voi
10bc0 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63  d*),  /* Callbac
10bd0 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  k to invoke */. 
10be0 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10c10 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66  ontext */.){.#if
10c20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10c30 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
10c40 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
10c50 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
10c60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10c70 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10c80 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
10c90 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10ca0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
10cb0 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54 72   mTrace==0 ) xTr
10cc0 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 78  ace = 0;.  if( x
10cd0 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61 63  Trace==0 ) mTrac
10ce0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72  e = 0;.  db->mTr
10cf0 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20  ace = mTrace;.  
10d00 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
10d10 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
10d20 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
10d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10d40 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10d60 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
10d70 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10d80 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ATED./*.** Regis
10d90 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
10da0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
10db0 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
10dc0 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
10dd0 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
10de0 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
10df0 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
10e00 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
10e10 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
10e20 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
10e30 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
10e40 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
10e50 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10e60 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
10e70 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
10e80 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
10e90 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
10ea0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
10eb0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
10ec0 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
10ed0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
10ee0 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
10ef0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
10f00 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
10f10 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
10f20 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
10f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10f40 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10f50 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10f60 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10f70 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10f80 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10f90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10fa0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10fb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10fc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
10fd0 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
10fe0 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
10ff0 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
11000 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
11010 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 6d   = pArg;.  db->m
11020 54 72 61 63 65 20 26 3d 20 53 51 4c 49 54 45 5f  Trace &= SQLITE_
11030 54 52 41 43 45 5f 4e 4f 4e 4c 45 47 41 43 59 5f  TRACE_NONLEGACY_
11040 4d 41 53 4b 3b 0a 20 20 69 66 28 20 64 62 2d 3e  MASK;.  if( db->
11050 78 50 72 6f 66 69 6c 65 20 29 20 64 62 2d 3e 6d  xProfile ) db->m
11060 54 72 61 63 65 20 7c 3d 20 53 51 4c 49 54 45 5f  Trace |= SQLITE_
11070 54 52 41 43 45 5f 58 50 52 4f 46 49 4c 45 3b 0a  TRACE_XPROFILE;.
11080 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11090 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
110a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
110b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
110c0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
110d0 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  TED */.#endif /*
110e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
110f0 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  CE */../*.** Reg
11100 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
11110 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
11120 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
11130 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66  n commits..** If
11140 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
11150 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
11160 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
11170 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
11180 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
11190 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
111a0 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
111b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
111d0 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
111e0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
111f0 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
11200 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
11210 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
11220 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
11230 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
11260 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
11270 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
11280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11290 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
112a0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
112b0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
112c0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
112d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
112e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
112f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
11300 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11310 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
11320 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
11330 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
11340 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
11350 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
11360 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
11370 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11380 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
11390 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
113a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
113b0 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
113c0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
113d0 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
113e0 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
113f0 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
11400 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
11410 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
11420 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
11430 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
11440 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
11460 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
11470 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
11480 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
11490 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
114a0 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
114b0 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
114c0 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
114d0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
114e0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
114f0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
11500 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
11510 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
11520 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
11530 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
11540 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
11550 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
11560 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
11570 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
11580 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11590 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
115a0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
115b0 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
115c0 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
115d0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
115e0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
115f0 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
11600 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
11610 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11620 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11630 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
11640 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
11650 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
11660 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
11670 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
11680 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
11690 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
116a0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
116b0 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
116c0 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
116d0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
116e0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
116f0 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
11700 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
11710 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
11720 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
11730 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
11740 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
11750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
11760 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
11770 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
11780 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
11790 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
117a0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
117b0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
117c0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
117d0 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
117e0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
117f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
11800 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
11810 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11820 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
11830 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
11840 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
11850 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
11860 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
11870 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
11880 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
11890 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
118a0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
118b0 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
118c0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
118d0 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
118e0 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
118f0 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
11900 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
11910 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
11920 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
11930 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
11940 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11950 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
11960 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
11970 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
11980 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11990 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
119a0 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
119b0 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28  abase */.  void(
119c0 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20  *xCallback)(    
119d0 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
119e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
119f0 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c   void*,sqlite3*,
11a00 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  int,char const*,
11a10 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69  char const*,sqli
11a20 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65  te3_int64,sqlite
11a30 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  3_int64),.  void
11a40 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
11a50 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
11a60 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
11a70 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
11a80 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
11a90 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11aa0 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
11ab0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
11ac0 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  g;.  db->xPreUpd
11ad0 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
11ae0 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
11af0 50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70  PreUpdateArg = p
11b00 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
11b10 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11b20 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11b30 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
11b40 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
11b50 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
11b60 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
11b70 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
11b80 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
11b90 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
11ba0 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
11bb0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
11bc0 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
11bd0 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
11be0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
11bf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11c00 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
11c10 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
11c20 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
11c30 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
11c40 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
11c50 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
11c60 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
11c70 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
11c80 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
11c90 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
11ca0 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
11cb0 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
11cc0 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
11cd0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
11ce0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
11cf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11d00 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
11d10 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
11d20 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
11d30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
11d40 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
11d50 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
11d60 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
11d70 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
11d80 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
11d90 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
11da0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
11db0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
11dc0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11dd0 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
11de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11df0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11e00 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
11e10 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
11e20 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
11e30 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
11e40 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
11e50 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
11e60 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
11e70 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
11e80 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
11e90 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
11ea0 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
11eb0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
11ec0 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
11ed0 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
11ee0 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
11ef0 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
11f00 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
11f10 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
11f20 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
11f30 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
11f40 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
11f50 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
11f60 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
11f70 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
11f80 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
11f90 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
11fa0 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
11fb0 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
11fc0 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
11fd0 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
11fe0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
11ff0 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
12000 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
12010 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
12020 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
12030 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
12040 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
12050 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
12060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12070 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
12080 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
12090 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
120a0 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
120b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
120c0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
120d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
120e0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
120f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12100 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
12110 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  dif.  if( nFrame
12120 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
12130 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
12140 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
12150 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
12160 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
12170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12180 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
12190 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
121a0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
121b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
121c0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
121d0 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
121e0 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
121f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12200 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
12210 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
12220 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
12230 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12240 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
12250 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
12260 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12280 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
12290 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
122a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
122b0 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
122c0 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
122d0 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
122e0 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12300 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
12310 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
12320 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
12330 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12340 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
12350 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
12360 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
12370 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
12380 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
12390 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
123a0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
123b0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
123c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
123d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
123e0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
123f0 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
12400 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
12410 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
12420 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
12430 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
12440 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12450 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12460 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
12470 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12480 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
12490 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
124a0 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
124b0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
124c0 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
124d0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
124e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
124f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
12500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12510 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12520 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
12530 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
12540 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
12550 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12570 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12580 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
12590 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
125c0 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
125d0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
125e0 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
125f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
12600 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
12610 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
12620 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
12630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12650 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
12660 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12680 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
12690 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
126a0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
126b0 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
126c0 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
126d0 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23  checkpoint */..#
126e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
126f0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
12700 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
12710 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
12720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
12730 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
12740 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  f..  /* Initiali
12750 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
12760 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
12770 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
12780 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
12790 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
127a0 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
127b0 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
127c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
127d0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
127e0 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61  ASSIVE==0 );.  a
127f0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
12800 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31  ECKPOINT_FULL==1
12810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
12820 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
12830 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20  RESTART==2 );.  
12840 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
12850 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
12860 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65  TE==3 );.  if( e
12870 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
12880 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
12890 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
128a0 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
128b0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TE ){.    /* EVI
128c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39  DENCE-OF: R-0399
128d0 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61  6-12088 The M pa
128e0 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
128f0 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69  a valid checkpoi
12900 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20  nt.    ** mode: 
12910 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
12920 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
12930 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
12940 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
12950 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
12960 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
12970 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
12980 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
12990 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
129a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
129b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
129c0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
129d0 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  sg(db, SQLITE_ER
129e0 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
129f0 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
12a00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12a10 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
12a20 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72  nBusy = 0;.    r
12a30 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b  c = sqlite3Check
12a40 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65  point(db, iDb, e
12a50 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
12a60 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kpt);.    sqlite
12a70 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
12a80 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12a90 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
12aa0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
12ab0 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
12ac0 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61  statements, clea
12ad0 72 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20  r the interrupt 
12ae0 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a  flag at this.  *
12af0 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69  * point.  */.  i
12b00 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
12b10 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ve==0 ){.    db-
12b20 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
12b30 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71  d = 0;.  }..  sq
12b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12b50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12b60 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12b70 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
12b80 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
12b90 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
12ba0 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
12bb0 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
12bc0 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
12bd0 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
12be0 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
12bf0 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
12c00 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
12c10 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12c20 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12c30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
12c40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
12c50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
12c60 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20  : R-41613-20553 
12c70 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
12c80 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20  checkpoint(D,X) 
12c90 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
12ca0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61  .  ** sqlite3_wa
12cb0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
12cc0 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  D,X,SQLITE_CHECK
12cd0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
12ce0 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  0). */.  return 
12cf0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12d00 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62  kpoint_v2(db,zDb
12d10 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
12d20 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b  NT_PASSIVE,0,0);
12d30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12d40 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
12d50 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
12d60 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
12d70 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
12d80 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
12d90 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
12da0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
12db0 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
12dc0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12dd0 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
12de0 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
12df0 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
12e00 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
12e10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
12e20 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
12e30 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
12e40 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
12e50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
12e60 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
12e70 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
12e80 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
12e90 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
12ea0 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
12eb0 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
12ec0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
12ed0 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
12ee0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12ef0 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
12f00 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
12f10 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
12f20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12f30 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
12f40 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
12f50 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
12f60 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
12f70 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
12f80 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
12f90 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
12fa0 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
12fb0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
12fc0 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
12fd0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
12fe0 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
12ff0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
13000 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
13010 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
13020 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
13030 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
13040 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
13050 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
13060 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
13070 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
13080 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
13090 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
130a0 46 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a 2a  FULL, RESTART.**
130b0 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a 2f   or TRUNCATE..*/
130c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
130d0 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
130e0 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
130f0 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
13100 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
13110 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13120 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
13130 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
13140 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13170 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
13180 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
13190 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
131a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
131b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
131c0 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
131d0 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
131e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
131f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13200 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
13210 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
13220 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
13230 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
13240 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
13250 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
13260 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
13270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
13280 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
13290 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
132a0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
132b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
132c0 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
132d0 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
132e0 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
132f0 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
13300 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
13310 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
13320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13330 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
13340 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
13350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13360 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13370 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13380 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
13390 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
133a0 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
133b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
133c0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
133d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
133e0 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
133f0 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
13400 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
13410 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
13420 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
13430 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
13440 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
13450 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
13460 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
13470 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
13480 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
13490 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
134a0 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
134b0 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
134c0 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
134d0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
134e0 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
134f0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
13500 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
13510 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
13520 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
13530 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
13540 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
13550 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
13560 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
13570 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
13580 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
13590 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
135a0 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
135d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
135f0 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
13600 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
13620 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
13630 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
13670 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
136a0 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
136b0 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
136e0 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
136f0 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
13700 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13710 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
13720 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
13730 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
13740 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
13750 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
13770 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
13780 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
137c0 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
137f0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
13800 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
13810 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
13820 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
13830 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
13840 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
13850 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
13860 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
13870 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13880 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
13890 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
138a0 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
138b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
138c0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
138d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
138e0 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
138f0 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
13900 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13910 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
13920 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53  P_STORE>3.  UNUS
13930 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
13940 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
13950 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
13960 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
13970 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
13980 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
13990 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
139a0 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
139b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
139c0 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
139d0 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
139e0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
139f0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
13a00 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
13a10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13a20 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  T);.  }.  if( !s
13a30 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
13a40 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
13a50 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
13a60 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
13a70 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20  _MISUSE_BKPT);. 
13a80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13a90 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
13aa0 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
13ab0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13ac0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
13ad0 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
13ae0 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65  M_BKPT);.  }else
13af0 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
13b00 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20  db->pErr==0 );. 
13b10 20 20 20 7a 20 3d 20 64 62 2d 3e 65 72 72 43 6f     z = db->errCo
13b20 64 65 20 3f 20 28 63 68 61 72 2a 29 73 71 6c 69  de ? (char*)sqli
13b30 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
13b40 62 2d 3e 70 45 72 72 29 20 3a 20 30 3b 0a 20 20  b->pErr) : 0;.  
13b50 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
13b60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
13b70 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
13b80 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
13b90 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
13ba0 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
13bb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13bc0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
13bd0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
13be0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13bf0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
13c00 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
13c10 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
13c20 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
13c30 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
13c40 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
13c50 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
13c60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
13c70 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13c80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
13c90 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
13ca0 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
13cb0 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
13cc0 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
13cd0 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
13ce0 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
13cf0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
13d00 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
13d10 27 62 27 2c 20 27 61 27 2c 20 27 64 27 2c 20 27  'b', 'a', 'd', '
13d20 20 27 2c 20 27 70 27 2c 20 27 61 27 2c 20 27 72   ', 'p', 'a', 'r
13d30 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27  ', 'a', 'm', 'e'
13d40 2c 20 27 74 27 2c 20 27 65 27 2c 20 27 72 27 2c  , 't', 'e', 'r',
13d50 20 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27   ' ',.    'o', '
13d60 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 74  r', ' ', 'o', 't
13d70 27 2c 20 27 68 27 2c 20 27 65 27 2c 20 27 72 27  ', 'h', 'e', 'r'
13d80 2c 20 27 20 27 2c 20 27 41 27 2c 20 27 50 27 2c  , ' ', 'A', 'P',
13d90 20 27 49 27 2c 20 27 20 27 2c 0a 20 20 20 20 27   'I', ' ',.    '
13da0 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c 20 27 75  m', 'i', 's', 'u
13db0 27 2c 20 27 73 27 2c 20 27 65 27 2c 20 30 0a 20  ', 's', 'e', 0. 
13dc0 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
13dd0 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
13de0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
13df0 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
13e00 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
13e10 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
13e20 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
13e30 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
13e40 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
13e50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13e60 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
13e70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13e80 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
13e90 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
13ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
13eb0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
13ec0 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
13ed0 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
13ee0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13ef0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
13f00 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71   db->errCode, sq
13f10 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
13f20 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20  errCode));.     
13f30 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
13f40 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
13f50 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
13f60 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
13f70 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
13f80 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
13f90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13fa0 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
13fb0 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
13fc0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
13fd0 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
13fe0 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
13ff0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
14000 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
14010 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
14020 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
14030 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
14040 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
14050 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
14060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14070 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
14080 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ge..    */.    s
14090 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64  qlite3OomClear(d
140a0 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
140b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
140c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
140d0 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
140e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
140f0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
14100 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
14110 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
14120 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
14130 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
14140 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
14150 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
14160 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
14170 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14180 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
14190 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
141a0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
141b0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
141c0 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
141d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
141e0 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
141f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14200 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
14210 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
14220 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14230 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14240 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
14260 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
14270 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
14280 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
14290 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
142a0 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
142b0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
142c0 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
142d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
142e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
142f0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
14300 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
14310 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
14320 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
14330 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
14340 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
14350 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  }.int sqlite3_sy
14360 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74  stem_errno(sqlit
14370 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
14380 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45  n db ? db->iSysE
14390 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f  rrno : 0;.}  ../
143a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
143b0 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
143c0 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
143d0 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
143e0 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
143f0 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68  nt.  For now, th
14400 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20  is simply calls 
14410 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c  the internal sql
14420 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20  ite3ErrStr().** 
14430 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  function..*/.con
14440 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
14450 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b  _errstr(int rc){
14460 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14470 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a  3ErrStr(rc);.}..
14480 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
14490 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
144a0 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
144b0 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
144c0 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
144d0 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
144e0 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
144f0 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
14500 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
14510 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
14520 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
14530 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
14540 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
14550 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
14560 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
14570 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
14580 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
14590 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
145a0 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
145b0 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  2;.  .  assert( 
145c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
145d0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
145e0 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
145f0 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
14600 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
14610 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
14620 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
14630 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
14640 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
14650 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
14660 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
14670 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
14680 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
14690 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
146a0 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
146b0 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
146c0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
146d0 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
146e0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
146f0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
14700 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
14710 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
14720 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
14730 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
14740 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
14750 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
14760 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
14770 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
14780 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
14790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
147a0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
147b0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
147c0 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
147d0 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
147e0 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
147f0 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
14800 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
14810 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
14820 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
14830 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
14840 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
14850 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
14860 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
14870 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
14880 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
14890 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
148a0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
148b0 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
148c0 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
148d0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
148e0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
148f0 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
14900 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
14910 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
14920 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
14930 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
14940 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
14950 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
14960 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
14970 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
14980 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
14990 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
149a0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
149b0 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29  tatements(db, 0)
149c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
149d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
149e0 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
149f0 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
14a00 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
14a10 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
14a20 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
14a30 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
14a40 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
14a50 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
14a60 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
14a70 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
14a80 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
14a90 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
14aa0 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
14ab0 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
14ac0 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
14ad0 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
14ae0 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
14af0 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
14b00 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
14b10 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
14b20 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
14b30 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
14b40 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
14b50 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
14b60 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  eq, zName);.    
14b70 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
14b80 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
14b90 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
14ba0 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a  eq *p = &aColl[j
14bb0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
14bc0 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
14bd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
14be0 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20  f( p->xDel ){.  
14bf0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65            p->xDe
14c00 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20  l(p->pUser);.   
14c10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14c20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a     p->xCmp = 0;.
14c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14c40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
14c50 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
14c60 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
14c70 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31  8)enc2, zName, 1
14c80 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  );.  if( pColl==
14c90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
14ca0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14cb0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
14cc0 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
14cd0 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
14ce0 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
14cf0 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
14d00 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
14d10 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
14d20 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
14d30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14d40 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
14d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14d60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
14d70 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68   array defines h
14d80 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73  ard upper bounds
14d90 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73   on limit values
14da0 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61  .  The.** initia
14db0 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65  lizer must be ke
14dc0 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  pt in sync with 
14dd0 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
14de0 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69  _*.** #defines i
14df0 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a  n sqlite3.h..*/.
14e00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
14e10 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20   aHardLimit[] = 
14e20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  {.  SQLITE_MAX_L
14e30 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
14e40 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a  MAX_SQL_LENGTH,.
14e50 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c    SQLITE_MAX_COL
14e60 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  UMN,.  SQLITE_MA
14e70 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20  X_EXPR_DEPTH,.  
14e80 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
14e90 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51  UND_SELECT,.  SQ
14ea0 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
14eb0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ,.  SQLITE_MAX_F
14ec0 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53  UNCTION_ARG,.  S
14ed0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
14ee0 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  ED,.  SQLITE_MAX
14ef0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
14f00 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
14f10 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
14f20 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  ER,      /* IMP:
14f30 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a   R-38091-32352 *
14f40 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  /.  SQLITE_MAX_T
14f50 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20  RIGGER_DEPTH,.  
14f60 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
14f70 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f  R_THREADS,.};../
14f80 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
14f90 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61  he hard limits a
14fa0 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e  re set to reason
14fb0 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  able values.*/.#
14fc0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  if SQLITE_MAX_LE
14fd0 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
14fe0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
14ff0 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
15000 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
15010 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
15020 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  L_LENGTH<100.# e
15030 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15040 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
15050 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
15060 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
15070 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
15080 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  >SQLITE_MAX_LENG
15090 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  TH.# error SQLIT
150a0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
150b0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65   must not be gre
150c0 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ater than SQLITE
150d0 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64  _MAX_LENGTH.#end
150e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
150f0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
15100 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  T<2.# error SQLI
15110 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
15120 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61  SELECT must be a
15130 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66  t least 2.#endif
15140 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15150 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72  VDBE_OP<40.# err
15160 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  or SQLITE_MAX_VD
15170 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74  BE_OP must be at
15180 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66   least 40.#endif
15190 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
151a0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c  FUNCTION_ARG<0 |
151b0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  | SQLITE_MAX_FUN
151c0 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20  CTION_ARG>127.# 
151d0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
151e0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
151f0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
15200 61 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23  and 127.#endif.#
15210 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  if SQLITE_MAX_AT
15220 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49  TACHED<0 || SQLI
15230 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e  TE_MAX_ATTACHED>
15240 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  125.# error SQLI
15250 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
15260 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
15270 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66  0 and 125.#endif
15280 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15290 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
152a0 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  GTH<1.# error SQ
152b0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
152c0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73  TTERN_LENGTH mus
152d0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
152e0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
152f0 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37  E_MAX_COLUMN>327
15300 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  67.# error SQLIT
15310 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73  E_MAX_COLUMN mus
15320 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37  t not exceed 327
15330 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  67.#endif.#if SQ
15340 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
15350 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72  _DEPTH<1.# error
15360 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
15370 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62  GER_DEPTH must b
15380 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
15390 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
153a0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
153b0 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  S<0 || SQLITE_MA
153c0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
153d0 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >50.# error SQLI
153e0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
153f0 52 45 41 44 53 20 6d 75 73 74 20 62 65 20 62 65  READS must be be
15400 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23  tween 0 and 50.#
15410 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
15420 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
15430 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
15440 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
15450 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
15460 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
15470 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
15480 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
15490 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
154a0 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
154b0 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
154c0 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
154d0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
154e0 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
154f0 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
15500 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
15510 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
15520 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
15530 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
15540 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
15550 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
15560 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
15570 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
15580 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
15590 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
155a0 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
155b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
155c0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
155d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
155e0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
155f0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
15600 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
15610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
15620 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15630 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
15640 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72  -30189-54097 For
15650 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65   each limit cate
15660 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49  gory SQLITE_LIMI
15670 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72  T_NAME.  ** ther
15680 65 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65  e is a hard uppe
15690 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63  r bound set at c
156a0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61  ompile-time by a
156b0 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a   C preprocessor.
156c0 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65    ** macro calle
156d0 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d  d SQLITE_MAX_NAM
156e0 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f  E. (The "_LIMIT_
156f0 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73  " in the name is
15700 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a   changed to.  **
15710 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a   "_MAX_".).  */.
15720 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15730 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15740 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  T_LENGTH]==SQLIT
15750 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a  E_MAX_LENGTH );.
15760 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15770 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15780 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53  T_SQL_LENGTH]==S
15790 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
157a0 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
157b0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
157c0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
157d0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
157e0 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  LUMN );.  assert
157f0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15800 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
15810 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
15820 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a  X_EXPR_DEPTH );.
15830 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15840 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15850 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15860 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43  T]==SQLITE_MAX_C
15870 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b  OMPOUND_SELECT);
15880 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15890 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
158a0 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c  IT_VDBE_OP]==SQL
158b0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
158c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
158d0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
158e0 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
158f0 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46  G]==SQLITE_MAX_F
15900 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20  UNCTION_ARG );. 
15910 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15920 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15930 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49  _ATTACHED]==SQLI
15940 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
15950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15960 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15970 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
15980 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20  N_LENGTH]==.    
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
159c0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
159d0 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  RN_LENGTH );.  a
159e0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
159f0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
15a00 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d  ARIABLE_NUMBER]=
15a10 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  =SQLITE_MAX_VARI
15a20 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
15a30 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
15a40 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
15a50 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d  TRIGGER_DEPTH]==
15a60 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
15a70 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  ER_DEPTH );.  as
15a80 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15a90 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
15aa0 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53  RKER_THREADS]==S
15ab0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
15ac0 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73  _THREADS );.  as
15ad0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d  sert( SQLITE_LIM
15ae0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
15af0 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  S==(SQLITE_N_LIM
15b00 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28  IT-1) );...  if(
15b10 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69   limitId<0 || li
15b20 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f  mitId>=SQLITE_N_
15b30 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74  LIMIT ){.    ret
15b40 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c  urn -1;.  }.  ol
15b50 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69  dLimit = db->aLi
15b60 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20  mit[limitId];.  
15b70 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
15b80 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
15b90 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35       /* IMP: R-5
15ba0 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20  2476-28732 */.  
15bb0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61    if( newLimit>a
15bc0 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
15bd0 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  d] ){.      newL
15be0 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69  imit = aHardLimi
15bf0 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20  t[limitId];  /* 
15c00 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36  IMP: R-51463-256
15c10 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  34 */.    }.    
15c20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
15c30 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Id] = newLimit;.
15c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64    }.  return old
15c50 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
15c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
15c70 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39  P: R-53341-35419
15c80 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   */.}../*.** Thi
15c90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
15ca0 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68  ed to parse both
15cb0 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52   URIs and non-UR
15cc0 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73  I filenames pass
15cd0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65  ed by the.** use
15ce0 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  r to API functio
15cf0 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ns sqlite3_open(
15d00 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65  ) or sqlite3_ope
15d10 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20  n_v2(), and for 
15d20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73  database.** URIs
15d30 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
15d40 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61  rt of ATTACH sta
15d50 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
15d60 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15d70 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
15d80 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  on is the name o
15d90 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
15da0 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74   (or.** a NULL t
15db0 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65  o signify the de
15dc0 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68  fault VFS) if th
15dd0 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63  e URI does not c
15de0 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78  ontain a "vfs=xx
15df0 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  x".** query para
15e00 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  meter. The secon
15e10 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61  d argument conta
15e20 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20  ins the URI (or 
15e30 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
15e40 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65  ).** itself. Whe
15e50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
15e60 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70  is called the *p
15e70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73  Flags variable s
15e80 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
15e90 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61   the default fla
15ea0 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  gs to open the d
15eb0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
15ec0 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73  ith. The value s
15ed0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c  tored in.** *pFl
15ee0 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74  ags may be updat
15ef0 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
15f00 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66  ing if the URI f
15f10 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73  ilename contains
15f20 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22   .** "cache=xxx"
15f30 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71   or "mode=xxx" q
15f40 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e  uery parameters.
15f50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
15f60 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
15f70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
15f80 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73  this case *ppVfs
15f90 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
15fa0 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74   to.** the VFS t
15fb0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
15fc0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ed to open the d
15fd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70  atabase file. *p
15fe0 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a  zFile is set to.
15ff0 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  ** point to a bu
16000 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
16010 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
16020 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74  file to open. It
16030 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
16040 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
16050 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
16060 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69  tually call sqli
16070 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65  te3_free() to re
16080 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
16090 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ffer..**.** If a
160a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
160b0 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  then an SQLite e
160c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
160d0 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72  urned and *pzErr
160e0 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
160f0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
16100 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
16110 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
16120 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
16130 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
16140 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
16150 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
16160 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
16170 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75  lease.** this bu
16180 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20  ffer by calling 
16190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
161a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
161b0 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20  rseUri(.  const 
161c0 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66  char *zDefaultVf
161d0 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53  s,        /* VFS
161e0 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76   to use if no "v
161f0 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70  fs=xxx" query op
16200 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
16210 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20  char *zUri,     
16220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c            /* Nul
16230 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20  -terminated URI 
16240 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e  to parse */.  un
16250 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61  signed int *pFla
16260 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs,           /*
16270 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f   IN/OUT: SQLITE_
16280 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a  OPEN_XXX flags *
16290 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
162a0 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20  **ppVfs,        
162b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20      /* OUT: VFS 
162c0 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61  to use */ .  cha
162d0 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20  r **pzFile,     
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162f0 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f  OUT: Filename co
16300 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a  mponent of URI *
16310 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
16320 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
16330 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
16340 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63  r message (if rc
16350 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a  !=SQLITE_OK) */.
16360 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67  LITE_OK;.  unsig
16380 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ned int flags = 
16390 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74  *pFlags;.  const
163a0 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44   char *zVfs = zD
163b0 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61  efaultVfs;.  cha
163c0 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
163d0 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   c;.  int nUri =
163e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
163f0 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72  (zUri);..  asser
16400 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20  t( *pzErrMsg==0 
16410 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67  );..  if( ((flag
16420 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16430 55 52 49 29 20 20 20 20 20 20 20 20 20 20 20 20  URI)            
16440 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35   /* IMP: R-48725
16450 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20  -32206 */.      
16460 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
16470 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
16480 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52  enUri) /* IMP: R
16490 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a  -51689-46548 */.
164a0 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
164b0 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
164c0 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20  ile:", 5)==0 /* 
164d0 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34  IMP: R-57884-374
164e0 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63  96 */.  ){.    c
164f0 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69  har *zOpt;.    i
16500 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16520 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68 65  Parser state whe
16530 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f  n parsing URI */
16540 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20  .    int iIn;   
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16560 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72     /* Input char
16570 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
16580 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61   /* Output chara
165b0 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cter index */.  
165c0 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55    u64 nByte = nU
165d0 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20  ri+2;           
165e0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
165f0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
16600 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
16610 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50  re the SQLITE_OP
16620 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73  EN_URI flag is s
16630 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  et to indicate t
16640 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20  o the VFS xOpen 
16650 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74  .    ** method t
16660 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  hat there may be
16670 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72   extra parameter
16680 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
16690 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20  file-name.  */. 
166a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
166b0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20  TE_OPEN_URI;..  
166c0 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e    for(iIn=0; iIn
166d0 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42  <nUri; iIn++) nB
166e0 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e  yte += (zUri[iIn
166f0 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69  ]=='&');.    zFi
16700 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
16710 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
16720 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
16730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16740 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49  EM_BKPT;..    iI
16750 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51  n = 5;.#ifdef SQ
16760 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41  LITE_ALLOW_URI_A
16770 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28  UTHORITY.    if(
16780 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
16790 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
167a0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
167b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
167c0 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e  lowing condition
167d0 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69 74   causes URIs wit
167e0 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f  h five leading /
167f0 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
16800 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f    ** like file:/
16810 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f  ////host/path to
16820 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
16830 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68  to UNCs like //h
16840 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20  ost/path..      
16850 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 55  ** The correct U
16860 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20  RI for that UNC 
16870 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20  has only two or 
16880 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63  four leading / c
16890 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
168a0 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70  ** file://host/p
168b0 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f  ath or file:////
168c0 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20  host/path.  But 
168d0 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65  5 leading slashe
168e0 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a  s is a .      **
168f0 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77   common error, w
16900 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77  e are told, so w
16910 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61  e handle it as a
16920 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a   special case. *
16930 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
16940 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f  cmp(zUri+7, "///
16950 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b  ", 3)==0 ){ iIn+
16960 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69  +; }.    }else 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 6c 6f 63 61 6c 68 6f 73 74 2f  5, "//localhost/
16990 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 12)==0 ){.   
169a0 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20     iIn = 16;.   
169b0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
169c0 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
169d0 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
169e0 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
169f0 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
16a00 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
16a10 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
16a20 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
16a30 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
16a40 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
16a50 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
16a60 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ;.      if( iIn!
16a70 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
16a80 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
16a90 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
16aa0 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
16ab0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
16ac0 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
16ad0 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
16ae0 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
16af0 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
16b00 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
16b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
16b20 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
16b30 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
16b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
16b50 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  ndif..    /* Cop
16b60 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
16b70 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
16b80 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
16b90 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
16ba0 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
16bb0 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
16bc0 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
16bd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
16be0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
16bf0 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
16c00 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
16c10 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
16c20 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
16c30 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
16c40 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
16c50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
16c60 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
16c70 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
16c80 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
16c90 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
16ca0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
16cb0 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
16cc0 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
16cd0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
16ce0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
16cf0 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
16d00 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
16d10 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
16d20 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
16d30 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
16d40 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
16d50 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
16d60 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
16d70 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
16d80 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
16d90 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
16da0 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
16db0 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
16dc0 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
16dd0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
16de0 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
16df0 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
16e00 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
16e10 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
16e20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
16e30 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
16e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
16e50 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  tet==0 ){.#ifnde
16e60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16e70 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20  URI_00_ERROR.   
16e80 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
16e90 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
16ea0 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72  hen "%00" appear
16eb0 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49  s within the URI
16ec0 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20  . In this.      
16ed0 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69      ** case we i
16ee0 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69  gnore all text i
16ef0 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
16f00 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d  of the path, nam
16f10 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  e or.          *
16f20 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  * value currentl
16f30 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20  y being parsed. 
16f40 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75  So ignore the cu
16f50 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a  rrent character.
16f60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
16f70 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78   skip to the nex
16f80 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26  t "?", "=" or "&
16f90 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
16fa0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
16fb0 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
16fc0 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
16fd0 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '#' .           
16fe0 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30     && (eState!=0
16ff0 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20   || c!='?').    
17000 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
17010 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27  tate!=1 || (c!='
17020 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20  =' && c!='&')). 
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
17040 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21  (eState!=2 || c!
17050 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='&').          
17060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17070 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
17080 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
17090 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  inue;.#else.    
170a0 20 20 20 20 20 20 2f 2a 20 49 66 20 45 4e 41 42        /* If ENAB
170b0 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 20  LE_URI_00_ERROR 
170c0 69 73 20 64 65 66 69 6e 65 64 2c 20 22 25 30 30  is defined, "%00
170d0 22 20 69 6e 20 61 20 55 52 49 20 69 73 20 61 6e  " in a URI is an
170e0 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20   error. */.     
170f0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
17100 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17110 28 22 75 6e 65 78 70 65 63 74 65 64 20 25 25 30  ("unexpected %%0
17120 30 20 69 6e 20 75 72 69 22 29 3b 0a 20 20 20 20  0 in uri");.    
17130 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17140 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
17150 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
17160 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20  i_out;.#endif.  
17170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17180 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
17190 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
171a0 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
171b0 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
171c0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
171d0 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
171e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
171f0 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
17200 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
17210 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
17220 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
17230 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
17240 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
17250 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
17260 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
17270 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
17280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17290 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
172a0 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
172b0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
172c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
172d0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
172e0 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
172f0 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
17300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
17310 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
17320 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
17330 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
17340 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
17350 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
17360 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17370 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
17380 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
17390 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
173a0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
173b0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
173c0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
173d0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
173e0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
173f0 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
17400 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
17410 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
17420 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
17430 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
17440 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
17450 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
17460 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
17470 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
17480 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
17490 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
174a0 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
174b0 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
174c0 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
174d0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
174e0 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
174f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
17500 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
17510 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
17520 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
17530 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17540 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
17550 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
17560 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
17570 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
17580 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
17590 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
175a0 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
175b0 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
175c0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
175d0 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
175e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
175f0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
17600 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
17610 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
17620 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
17630 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
17640 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
17650 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
17660 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
17670 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
17680 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
17690 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
176a0 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
176b0 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
176c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
176d0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
176e0 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
176f0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
17700 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
17710 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
17720 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
17730 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
17740 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
17750 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
17760 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
17770 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
17780 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
17790 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
177a0 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
177b0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
177c0 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
177d0 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
177e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
177f0 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
17800 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
17810 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
17820 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17830 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
17840 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
17850 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
17860 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
17870 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
17880 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
17890 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
178a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
178b0 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
178c0 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
178d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
178e0 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
178f0 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
17900 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17910 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
17920 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
17930 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
17940 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
17950 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
17960 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
17970 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
17980 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
17990 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
179a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
179b0 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
179c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
179d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
179e0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
179f0 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
17a00 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
17a10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
17a20 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
17a30 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
17a40 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
17a50 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
17a60 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
17a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
17a80 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
17a90 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
17aa0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
17ab0 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
17ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
17ad0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
17ae0 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
17af0 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
17b00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17b10 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
17b20 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
17b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
17b40 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
17b50 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
17b60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
17b90 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
17ba0 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
17bb0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
17bc0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
17bd0 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
17be0 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
17bf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
17c00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17c10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
17c20 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
17c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17c40 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
17c50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
17c60 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
17c70 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
17c80 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
17c90 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
17ca0 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
17ce0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
17cf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17d00 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
17d10 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
17d20 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
17d30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
17d40 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
17d50 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
17d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17d70 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
17d80 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
17d90 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
17da0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
17db0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32  _malloc64(nUri+2
17dc0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
17dd0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
17de0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
17df0 20 20 69 66 28 20 6e 55 72 69 20 29 7b 0a 20 20    if( nUri ){.  
17e00 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65      memcpy(zFile
17e10 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
17e20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e     }.    zFile[n
17e30 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Uri] = '\0';.   
17e40 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d   zFile[nUri+1] =
17e50 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73   '\0';.    flags
17e60 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
17e70 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  _URI;.  }..  *pp
17e80 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
17e90 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
17ea0 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b  if( *ppVfs==0 ){
17eb0 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
17ec0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17ed0 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25  ("no such vfs: %
17ee0 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72  s", zVfs);.    r
17ef0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
17f00 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69  ;.  }. parse_uri
17f10 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
17f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
17f40 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  ile);.    zFile 
17f50 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61  = 0;.  }.  *pFla
17f60 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70  gs = flags;.  *p
17f70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
17f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
17f90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17fa0 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
17fb0 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
17fc0 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
17fd0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
17fe0 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
17ff0 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
18000 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
18010 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
18020 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
18030 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
18040 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
18050 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18060 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
18070 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
18080 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
18090 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
180a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
180b0 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
180c0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
180d0 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
180e0 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
180f0 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
18100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
18110 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18120 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
18130 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
18140 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
18150 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
18160 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
18170 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
18180 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
181b0 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
181c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
181d0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
181e0 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
181f0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
18200 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
18210 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
18220 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
18230 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
18240 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
18250 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
18260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
18270 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
18280 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
18290 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
182a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
182b0 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
182c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
182d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
182e0 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
182f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18300 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
18310 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18320 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
18330 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18340 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  rc;.#endif..  if
18350 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
18360 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
18370 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
18380 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
18390 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
183a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
183b0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
183c0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
183d0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
183e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
183f0 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
18400 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
18410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
18420 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
18430 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18440 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
18450 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
18460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
18470 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
18480 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
18490 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
184a0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
184b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
184c0 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
184d0 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
184e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
184f0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
18500 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
18510 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
18520 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
18530 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
18540 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
18550 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
18560 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18570 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
18580 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
18590 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
185a0 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
185b0 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
185c0 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
185d0 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
185e0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
185f0 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
18600 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
18610 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18620 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
18630 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
18640 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
18650 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
18660 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
18670 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
18680 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
18690 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
186a0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
186b0 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
186c0 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
186d0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
186e0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
186f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
18700 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
18710 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18720 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18740 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
18750 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
18760 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
18770 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18790 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
187a0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
187b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
187c0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
187d0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
187e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
187f0 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18810 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18820 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
18830 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18840 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18860 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
18870 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
18880 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18890 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
188a0 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
188b0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
188c0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
188d0 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
188e0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
188f0 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
18900 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
18910 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
18920 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
18930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18940 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41  NABLE_MULTITHREA
18950 44 45 44 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c  DED_CHECKS.   ||
18960 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18970 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a  nfig.bCoreMutex.
18980 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
18990 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
189a0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
189b0 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
189c0 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
189d0 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
189e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
189f0 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
18a00 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
18a10 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
18a20 7d 0a 20 20 20 20 69 66 28 20 69 73 54 68 72 65  }.    if( isThre
18a30 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20  adsafe==0 ){.   
18a40 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 57     sqlite3MutexW
18a50 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28  arnOnContention(
18a60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
18a70 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
18a80 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
18a90 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
18aa0 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
18ab0 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
18ac0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
18ad0 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
18ae0 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
18af0 62 53 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c  bStatic;.  db->l
18b00 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
18b10 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  e = 1;.  sqlite3
18b20 46 61 73 74 50 72 6e 67 49 6e 69 74 28 26 64 62  FastPrngInit(&db
18b30 2d 3e 73 50 72 6e 67 29 3b 0a 20 20 61 73 73 65  ->sPrng);.  asse
18b40 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
18b50 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
18b60 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
18b70 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
18b80 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
18b90 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
18ba0 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
18bb0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
18bc0 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
18bd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18be0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
18bf0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
18c00 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
18c10 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
18c20 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
18c30 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18c40 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
18c50 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
18c60 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
18c70 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
18c80 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
18c90 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
18ca0 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
18cb0 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
18cc0 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
18cd0 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
18ce0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
18cf0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
18d00 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
18d10 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
18d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d30 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
18d40 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
18d50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
18d60 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18d80 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
18d90 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
18da0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
18db0 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18dd0 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
18de0 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
18df0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18e00 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
18e30 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
18e40 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18e50 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
18e60 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
18e70 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
18e80 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
18e90 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
18ea0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
18eb0 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
18ec0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
18ed0 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
18ee0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18ef0 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
18f00 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
18f10 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53  ed(SQLITE_REVERS
18f20 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45  E_UNORDERED_SELE
18f30 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  CTS).           
18f40 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
18f50 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64  everseOrder.#end
18f60 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
18f70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
18f80 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
18f90 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
18fa0 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c     | SQLITE_Cell
18fb0 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69  SizeCk.#endif.#i
18fc0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18fd0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
18fe0 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20  ENIZER).        
18ff0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
19000 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a  E_Fts3Tokenizer.
19010 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
19020 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
19030 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20 20 20  _QPSG).         
19040 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19050 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e 64  _EnableQPSG.#end
19060 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
19070 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 44 45  QLITE_DEFAULT_DE
19080 46 45 4e 53 49 56 45 29 0a 20 20 20 20 20 20 20  FENSIVE).       
19090 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
190a0 54 45 5f 44 65 66 65 6e 73 69 76 65 0a 23 65 6e  TE_Defensive.#en
190b0 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
190c0 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
190d0 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
190e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
190f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
19100 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
19110 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
19120 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
19130 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
19140 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19150 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
19160 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
19170 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
19180 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
19190 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
191a0 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
191b0 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
191c0 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
191d0 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
191e0 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
191f0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
19200 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
19210 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
19220 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
19230 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
19240 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
19250 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
19260 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
19270 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
19280 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
19290 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
192a0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
192b0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
192c0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
192d0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
192e0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
192f0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
19300 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
19310 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
19320 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
19330 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
19340 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
19350 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
19360 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
19370 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
19380 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
19390 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
193a0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
193b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
193c0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
193d0 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
193e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
193f0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
19400 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
19410 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
19420 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
19430 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
19440 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
19450 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
19460 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
19470 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
19480 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
19490 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
194a0 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
194b0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
194c0 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
194d0 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
194e0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
194f0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 0a 20  e/URI argument. 
19500 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c   **.  ** Only al
19510 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d  low sensible com
19520 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74  binations of bit
19530 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61  s in the flags a
19540 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20  rgument.  .  ** 
19550 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
19560 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20  f any non-sense 
19570 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75  combination is u
19580 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  sed.  If we.  **
19590 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c   do not block il
195a0 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f  legal combinatio
195b0 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c  ns here, it coul
195c0 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61  d trigger.  ** a
195d0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
195e0 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79  ts in deeper lay
195f0 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63  ers.  Sensible c
19600 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a  ombinations.  **
19610 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
19620 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   1:  SQLITE_OPEN
19630 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20  _READONLY.  **  
19640 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  2:  SQLITE_OPEN_
19650 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20  READWRITE.  **  
19660 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  6:  SQLITE_OPEN_
19670 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
19680 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20  TE_OPEN_CREATE. 
19690 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
196a0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61  ags = flags;.  a
196b0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
196c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
196d0 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
196e0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
196f0 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
19700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
19710 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
19720 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
19730 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
19740 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
19750 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
19760 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
19770 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
19780 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
19790 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
197a0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
197b0 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
197c0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
197d0 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
197e0 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
197f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
19800 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19810 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
19820 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
19830 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
19840 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a  qlite3ParseUri(z
19850 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
19860 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66  &flags, &db->pVf
19870 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72  s, &zOpen, &zErr
19880 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Msg);.  }.  if( 
19890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
198a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
198b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
198c0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
198d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
198e0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
198f0 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
19900 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
19910 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19920 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
19930 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19940 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
19950 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
19960 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
19970 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19980 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
19990 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
199a0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
199d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
199e0 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
199f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19a00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
19a10 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
19a20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19a30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
19a40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19a50 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
19a60 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
19a70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19a80 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
19a90 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
19aa0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
19ab0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
19ac0 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
19ad0 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  pBt);.  if( !db-
19ae0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
19af0 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
19b00 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69  _ENC(db);.  sqli
19b10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62  te3BtreeLeave(db
19b20 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
19b30 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
19b40 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
19b50 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
19b60 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
19b70 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
19b80 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
19b90 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72  ase is FULL; for
19ba0 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
19bb0 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46  atabase it is OF
19bc0 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  F. This matches 
19bd0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
19be0 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
19bf0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44  .  db->aDb[0].zD
19c00 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  bSName = "main";
19c10 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
19c20 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c  fety_level = SQL
19c30 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19c40 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d  HRONOUS+1;.  db-
19c50 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
19c60 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
19c70 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
19c80 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e  evel = PAGER_SYN
19c90 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20  CHRONOUS_OFF;.. 
19ca0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
19cb0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
19cc0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19cd0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19ce0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19cf0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
19d00 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
19d10 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
19d20 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
19d30 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
19d40 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
19d50 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
19d60 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
19d70 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
19d80 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
19d90 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
19da0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
19db0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
19dc0 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72 43  ite3RegisterPerC
19dd0 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e  onnectionBuiltin
19de0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20  Functions(db);. 
19df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
19e00 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64  rcode(db);..#ifd
19e10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19e20 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73  _FTS5.  /* Regis
19e30 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e  ter any built-in
19e40 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66   FTS5 module bef
19e50 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  ore loading the 
19e60 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65  automatic.  ** e
19e70 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20  xtensions. This 
19e80 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63  allows automatic
19e90 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72   extensions to r
19ea0 65 67 69 73 74 65 72 20 46 54 53 35 20 0a 20 20  egister FTS5 .  
19eb0 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e  ** tokenizers an
19ec0 64 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  d auxiliary func
19ed0 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28  tions.  */.  if(
19ee0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19ef0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
19f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
19f10 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28  sqlite3Fts5Init(
19f20 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
19f30 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
19f40 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
19f50 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
19f60 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
19f70 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
19f80 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
19f90 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
19fa0 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
19fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19fc0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
19fd0 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
19fe0 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
19ff0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a000 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
1a010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a020 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
1a030 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
1a040 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a050 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
1a060 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a070 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
1a080 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
1a090 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
1a0a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a0b0 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
1a0c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1a0d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
1a0e0 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
1a0f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1a100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a110 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
1a120 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
1a130 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
1a140 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
1a150 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a160 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a170 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a  E_ENABLE_FTS3 /*
1a180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
1a190 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45  efined by SQLITE
1a1a0 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a  _ENABLE_FTS4 */.
1a1b0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a1c0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a1d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a1e0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1a1f0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a200 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1a210 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a220 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ICU) || defined(
1a230 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
1a240 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20 20  U_COLLATIONS).  
1a250 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a260 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1a270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a280 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
1a290 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1a2a0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a2b0 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
1a2c0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a2d0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1a2e0 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
1a2f0 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
1a300 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a310 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a320 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
1a330 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
1a340 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1a350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1a360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a370 44 62 70 61 67 65 52 65 67 69 73 74 65 72 28 64  DbpageRegister(d
1a380 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a3a0 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
1a3b0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1a3c0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1a3d0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
1a3e0 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74  rc = sqlite3Dbst
1a3f0 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
1a400 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a410 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a420 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62  _JSON1.  if( !db
1a430 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a440 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1a450 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a460 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b  e3Json1Init(db);
1a470 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1a480 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a490 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69 66 28  E_STMTVTAB.  if(
1a4a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a4b0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1a4c0 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1a4d0 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
1a4e0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a4f0 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  if..  /* -DSQLIT
1a500 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1a510 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
1a520 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
1a530 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
1a540 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
1a550 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1a560 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
1a570 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
1a580 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
1a590 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
1a5a0 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
1a5b0 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
1a5c0 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
1a5d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
1a5e0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
1a5f0 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
1a600 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
1a610 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1a620 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
1a630 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
1a640 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
1a650 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a680 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1a690 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
1a6a0 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74    if( rc ) sqlit
1a6b0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
1a6c0 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
1a6d0 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
1a6e0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
1a6f0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
1a700 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
1a710 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
1a720 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a750 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
1a760 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
1a770 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
1a780 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
1a790 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
1a7a0 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
1a7b0 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b  out:.  if( db ){
1a7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1a7d0 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
1a7e0 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20  hreadsafe==0.   
1a7f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
1a800 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1a810 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
1a820 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a830 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a840 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
1a850 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
1a860 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
1a870 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
1a880 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
1a890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1a8a0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
1a8b0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
1a8c0 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
1a8d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a8e0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
1a8f0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1a900 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
1a910 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
1a920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1a930 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
1a940 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a950 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
1a960 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
1a970 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
1a980 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
1a990 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
1a9a0 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
1a9b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
1a9c0 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
1a9d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a9e0 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
1a9f0 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
1aa00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
1aa10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1aa20 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28  HAS_CODEC).  if(
1aa30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1aa40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1aa50 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *zKey;.    if( 
1aa60 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1aa70 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1aa80 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 29 21  pen, "hexkey"))!
1aa90 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b  =0 && zKey[0] ){
1aaa0 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
1aab0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1aac0 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f 64 65      char zDecode
1aad0 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  d[40];.      for
1aae0 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
1aaf0 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64  <sizeof(zDecoded
1ab00 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
1ab10 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b  xdigit(zKey[i]);
1ab20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1ab30 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
1ab40 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
1ab50 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20  Int(zKey[i]);.  
1ab60 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
1ab70 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f  =0 ) zDecoded[i/
1ab80 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
1ab90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1aba0 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20  3_key_v2(db, 0, 
1abb0 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a  zDecoded, i/2);.
1abc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
1abd0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
1abe0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
1abf0 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29 7b  n, "key"))!=0 ){
1ac00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
1ac10 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65  ey_v2(db, 0, zKe
1ac20 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  y, sqlite3Strlen
1ac30 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d  30(zKey));.    }
1ac40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1ac50 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1ac60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1ac70 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
1ac80 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1ac90 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1aca0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
1acb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1acc0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1acd0 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
1ace0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
1acf0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
1ad00 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1ad20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1ad30 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1ad40 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
1ad50 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1ad60 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
1ad70 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
1ad80 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1ad90 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
1ada0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
1adb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1adc0 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
1add0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1adf0 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
1ae00 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
1ae10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
1ae20 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
1ae30 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1ae40 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
1ae50 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
1ae60 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
1ae70 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
1ae80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ae90 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
1aea0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1aeb0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1aec0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
1aed0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1aee0 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1aef0 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
1af00 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
1af10 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
1af20 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
1af30 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
1af40 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
1af50 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1af60 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
1af70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1af80 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1af90 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
1afa0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1afb0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1afc0 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
1afd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1afe0 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
1aff0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1b000 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
1b010 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1b020 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
1b030 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
1b040 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
1b050 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
1b060 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
1b070 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
1b080 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
1b090 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
1b0a0 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
1b0b0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
1b0c0 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
1b0d0 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
1b0e0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1b0f0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
1b100 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1b110 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1b120 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b150 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1b160 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1b170 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
1b180 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
1b190 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
1b1a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b1b0 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
1b1c0 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
1b1d0 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
1b1e0 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
1b1f0 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
1b200 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
1b210 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
1b220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1b230 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1b240 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1b250 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
1b260 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
1b270 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
1b280 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b290 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1b2a0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1b2b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b2c0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1b2d0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1b2e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1b2f0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1b300 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b310 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b320 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1b330 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b340 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b350 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b360 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b370 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
1b380 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
1b390 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1b3a0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
1b3b0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1b3c0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
1b3d0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1b3e0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b3f0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1b400 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1b410 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1b420 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
1b430 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b450 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1b460 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b470 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b480 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b490 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b4a0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
1b4b0 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
1b4c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1b4d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1b4e0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1b4f0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1b500 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1b510 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1b520 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1b530 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1b540 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b550 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1b560 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1b570 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
1b580 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
1b590 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
1b5a0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1b5b0 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
1b5c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1b5d0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1b5e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1b5f0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1b600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b620 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1b630 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1b640 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b650 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1b660 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1b670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1b680 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
1b690 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1b6a0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1b6b0 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
1b6c0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b6d0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b6e0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b6f0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b700 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
1b710 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b720 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1b730 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b740 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1b750 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1b760 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1b770 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1b780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b790 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1b7a0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1b7b0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1b7c0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1b7d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b7e0 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1b7f0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1b800 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1b810 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1b820 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1b830 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1b840 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1b850 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1b860 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1b870 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1b880 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1b890 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1b8a0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1b8b0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1b8c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b8d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b8e0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1b8f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b900 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1b910 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1b920 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1b930 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1b940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1b950 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1b960 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1b970 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1b980 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b990 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1b9a0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1b9b0 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1b9c0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1b9d0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1b9e0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1b9f0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1ba00 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1ba10 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1ba20 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1ba30 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ba40 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ba50 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ba60 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1ba70 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1ba80 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1ba90 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1baa0 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1bab0 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1bac0 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1bad0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1bae0 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1baf0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1bb00 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1bb10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1bb20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1bb30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bb40 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bb50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1bb60 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1bb70 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1bb80 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1bb90 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1bba0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1bbb0 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1bbc0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1bbd0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1bbe0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1bbf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1bc00 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1bc10 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1bc20 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1bc30 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1bc40 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1bc50 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1bc60 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1bc70 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1bc80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bc90 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1bca0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1bcb0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1bcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1bcd0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1bce0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bcf0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1bd00 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1bd10 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1bd20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1bd30 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1bd40 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1bd50 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1bd60 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1bd70 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1bd80 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1bd90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1bda0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1bdb0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1bdc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bdd0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1bde0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1bdf0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1be00 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1be10 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1be20 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1be30 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1be40 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1be50 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1be60 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1be70 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1be80 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1be90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bea0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1beb0 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1bec0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1bed0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1bee0 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1bef0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1bf00 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1bf10 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1bf20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1bf30 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1bf40 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1bf50 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1bf60 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1bf70 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1bf80 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1bf90 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1bfa0 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1bfb0 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1bfc0 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1bfd0 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1bfe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1bff0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1c000 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1c010 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1c020 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1c030 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1c040 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1c050 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1c060 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1c070 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c080 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1c090 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1c0a0 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1c0b0 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1c0c0 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1c0d0 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1c0e0 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73  E_NOMEM and poss
1c0f0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1c100 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1c110 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1c120 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1c130 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1c140 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1c150 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1c160 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1c170 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1c180 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1c190 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1c1a0 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1c1b0 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1c1c0 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1c1d0 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1c1e0 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1c1f0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1c200 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1c210 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1c220 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1c230 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 69  te3ReportError(i
1c240 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e  nt iErr, int lin
1c250 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eno, const char 
1c260 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
1c270 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73  e3_log(iErr, "%s
1c280 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1c290 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1c2a0 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69         zType, li
1c2b0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
1c2c0 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
1c2d0 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69  return iErr;.}.i
1c2e0 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1c2f0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
1c300 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c310 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c320 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c330 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c340 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c350 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1c360 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72  o, "database cor
1c370 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74  ruption");.}.int
1c380 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1c390 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1c3a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1c3b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c3c0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1c3d0 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1c3e0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d  rtError(SQLITE_M
1c3f0 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22  ISUSE, lineno, "
1c400 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20  misuse");.}.int 
1c410 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
1c420 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1c430 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1c440 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c450 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1c460 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1c470 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1c480 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f  CANTOPEN, lineno
1c490 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  , "cannot open f
1c4a0 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20  ile");.}.#ifdef 
1c4b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
1c4c0 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 50   sqlite3CorruptP
1c4d0 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  gnoError(int lin
1c4e0 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  eno, Pgno pgno){
1c4f0 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30 30  .  char zMsg[100
1c500 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1c510 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73  rintf(sizeof(zMs
1c520 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61 62  g), zMsg, "datab
1c530 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 70  ase corruption p
1c540 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a  age %d", pgno);.
1c550 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1c560 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c570 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1c580 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1c590 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f  tError(SQLITE_CO
1c5a0 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a  RRUPT, lineno, z
1c5b0 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Msg);.}.int sqli
1c5c0 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  te3NomemError(in
1c5d0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1c5e0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1c5f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1c600 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1c610 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1c620 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  r(SQLITE_NOMEM, 
1c630 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a  lineno, "OOM");.
1c640 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65  }.int sqlite3Ioe
1c650 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74  rrnomemError(int
1c660 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1c670 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1c680 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1c690 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1c6a0 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1c6b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  (SQLITE_IOERR_NO
1c6c0 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f  MEM, lineno, "I/
1c6d0 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d  O OOM error");.}
1c6e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c6f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1c700 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
1c710 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
1c720 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
1c730 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1c740 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
1c750 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
1c760 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
1c770 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
1c780 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
1c790 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
1c7a0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
1c7b0 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
1c7c0 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
1c7d0 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
1c7e0 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
1c7f0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
1c800 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
1c810 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1c820 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
1c830 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1c840 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
1c850 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
1c860 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
1c870 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1c880 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
1c890 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
1c8a0 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
1c8b0 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tails..*/.int sq
1c8c0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
1c8d0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
1c8e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1c8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c900 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1c910 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c920 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
1c930 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
1c940 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
1c950 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
1c960 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
1c970 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
1c980 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1c990 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
1c9a0 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
1c9b0 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
1c9c0 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
1c9d0 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
1c9e0 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
1c9f0 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
1ca00 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
1ca10 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
1ca20 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
1ca30 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca50 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1ca60 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1ca70 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
1ca80 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
1ca90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
1caa0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1cab0 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
1cac0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
1cad0 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
1cae0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1caf0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
1cb00 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
1cb10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1cb20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
1cb30 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
1cb40 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
1cb50 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
1cb60 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72  iCol = 0;.  char
1cb70 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
1cb80 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
1cb90 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
1cba0 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
1cbb0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
1cbc0 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
1cbd0 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
1cbe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1cbf0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1cc00 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1cc10 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1cc20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  || zTableName==0
1cc30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1cc40 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1cc50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1cc60 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
1cc70 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
1cc80 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
1cc90 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1cca0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1ccb0 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
1ccc0 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
1ccd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1cce0 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
1ccf0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1cd00 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
1cd10 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1cd20 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
1cd30 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
1cd40 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
1cd50 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1cd60 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
1cd70 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1cd80 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
1cd90 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
1cda0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
1cdb0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1cdc0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
1cdd0 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
1cde0 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
1cdf0 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c  ed */.  if( zCol
1ce00 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  umnName==0 ){.  
1ce10 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65    /* Query for e
1ce20 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c  xistance of tabl
1ce30 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73  e only */.  }els
1ce40 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
1ce50 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
1ce60 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
1ce70 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
1ce80 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
1ce90 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
1cea0 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
1ceb0 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
1cec0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
1ced0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1cee0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
1cef0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1cf00 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
1cf10 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  d(pTab) && sqlit
1cf20 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
1cf30 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1cf40 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
1cf50 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  PKey;.        pC
1cf60 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26  ol = iCol>=0 ? &
1cf70 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1cf80 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 0;.      }els
1cf90 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
1cfa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1cfb0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1cfc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1cfd0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1cfe0 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
1cff0 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
1d000 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
1d010 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
1d020 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
1d030 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1d040 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
1d050 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
1d060 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
1d070 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
1d080 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1d090 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
1d0a0 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
1d0b0 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
1d0c0 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
1d0d0 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
1d0e0 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
1d0f0 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
1d100 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
1d110 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1d120 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
1d130 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
1d140 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
1d150 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
1d160 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
1d170 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
1d180 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
1d190 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
1d1a0 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
1d1b0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
1d1c0 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
1d1d0 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
1d1e0 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
1d1f0 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
1d200 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ,0);.    zCollSe
1d210 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
1d220 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
1d230 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
1d240 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1d250 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
1d260 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
1d270 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
1d280 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
1d290 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
1d2a0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1d2b0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
1d2c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1d2d0 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
1d2e0 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
1d2f0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
1d300 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
1d310 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
1d320 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1d330 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  ARY;.  }..error_
1d340 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
1d350 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1d360 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
1d370 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
1d380 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
1d390 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
1d3a0 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
1d3b0 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
1d3c0 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
1d3d0 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
1d3e0 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
1d3f0 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
1d400 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
1d410 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
1d420 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
1d430 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1d440 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
1d450 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
1d460 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
1d470 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
1d480 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
1d490 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
1d4a0 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
1d4b0 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
1d4c0 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
1d4d0 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
1d4e0 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
1d4f0 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
1d500 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
1d510 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
1d520 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
1d530 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d540 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
1d550 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1d560 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
1d570 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
1d580 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
1d590 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
1d5a0 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
1d5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1d5c0 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
1d5d0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
1d5e0 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
1d5f0 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
1d600 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d610 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1d620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1d630 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1d640 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d650 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1d660 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d670 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1d680 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1d690 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1d6a0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1d6b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1d6c0 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1d6d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1d6e0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1d6f0 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1d700 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1d710 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1d720 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1d730 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1d740 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1d750 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1d760 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1d770 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1d780 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1d790 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1d7a0 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1d7b0 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1d7c0 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1d7d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d7e0 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1d7f0 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1d800 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1d810 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1d820 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1d830 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1d840 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1d850 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1d860 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1d870 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1d880 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1d890 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d8a0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1d8b0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1d8c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1d8d0 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1d8e0 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1d8f0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1d900 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1d910 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1d920 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1d930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d940 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1d950 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1d960 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1d970 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1d980 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1d990 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1d9a0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d9b0 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1d9c0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1d9d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1d9e0 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1d9f0 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1da00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1da10 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1da20 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1da30 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1da40 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1da50 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1da60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1da70 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1da80 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1da90 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1daa0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1dab0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1dac0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1dad0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1dae0 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1daf0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1db00 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1db10 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1db20 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1db30 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1db40 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1db50 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1db60 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1db70 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1db80 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1db90 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1dba0 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1dbb0 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1dbc0 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1dbd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1dbe0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1dbf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
1dc00 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1dc10 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a   *(sqlite3_vfs**
1dc20 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1dc30 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b  agerVfs(pPager);
1dc40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1dc50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1dc60 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1dc70 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f  FCNTL_JOURNAL_PO
1dc80 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1dc90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1dca0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1dcb0 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67  gerJrnlFile(pPag
1dcc0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1dcd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1dce0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1dcf0 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
1dd00 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
1dd10 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29  *(unsigned int*)
1dd20 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1dd30 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70  gerDataVersion(p
1dd40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1dd50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1dd70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1dd80 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
1dd90 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pArg);.    }.  
1dda0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ddb0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1ddc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ddd0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1dde0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ddf0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1de00 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1de10 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1de20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1de30 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1de40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1de50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1de60 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53  NTESTABLE.  UNUS
1de70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29  ED_PARAMETER(op)
1de80 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73  ;.#else.  va_lis
1de90 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1dea0 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
1deb0 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
1dec0 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
1ded0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1dee0 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
1def0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1df00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1df10 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
1df20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
1df30 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1df40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1df50 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
1df60 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1df70 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
1df80 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
1df90 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
1dfa0 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
1dfb0 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
1dfc0 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
1dfd0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
1dfe0 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
1dff0 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
1e000 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e010 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e020 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
1e030 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1e040 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
1e050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e060 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1e070 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e  ** Reset the PRN
1e080 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e  G back to its un
1e090 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
1e0a0 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c  e.  The next cal
1e0b0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
1e0c0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29  te3_randomness()
1e0d0 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65   will reseed the
1e0e0 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69   PRNG using a si
1e0f0 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  ngle call.    **
1e100 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e   to the xRandomn
1e110 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ess method of th
1e120 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20  e default VFS.. 
1e130 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e140 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1e150 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20  RNG_RESET: {.   
1e160 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1e170 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20  mness(0,0);.    
1e180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1e190 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1e1a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e1b0 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
1e1c0 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
1e1d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
1e1e0 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
1e1f0 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
1e200 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
1e210 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
1e220 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
1e230 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1e240 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1e250 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
1e260 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
1e270 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
1e280 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
1e290 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
1e2a0 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
1e2b0 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
1e2c0 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1e2d0 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
1e2e0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1e2f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
1e300 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e310 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
1e320 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
1e330 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e340 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
1e350 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
1e360 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
1e370 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1e380 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
1e390 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
1e3a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e3b0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1e3c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e3d0 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78  FAULT_INSTALL, x
1e3e0 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a  Callback).    **
1e3f0 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20  .    ** Arrange 
1e400 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62  to invoke xCallb
1e410 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73  ack() whenever s
1e420 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29  qlite3FaultSim()
1e430 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20   is called,.    
1e440 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20  ** if xCallback 
1e450 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1e460 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20   **.    ** As a 
1e470 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c  test of the faul
1e480 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68  t simulator mech
1e490 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71  anism itself, sq
1e4a0 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1e4b0 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  .    ** is calle
1e4c0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
1e4d0 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74  ter installing t
1e4e0 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20  he new callback 
1e4f0 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20  and the return. 
1e500 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d     ** value from
1e510 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1e520 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  (0) becomes the 
1e530 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20  return from.    
1e540 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
1e550 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a  control()..    *
1e560 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e570 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
1e580 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20  _INSTALL: {.    
1e590 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
1e5a0 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
1e5b0 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
1e5c0 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
1e5d0 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
1e5e0 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
1e5f0 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
1e600 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
1e610 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1e620 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1e630 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20   int(*)(int));. 
1e640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
1e650 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43  pedef int(*TESTC
1e660 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69  ALLBACKFUNC_t)(i
1e670 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1e680 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1e690 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
1e6a0 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41  a_arg(ap, TESTCA
1e6b0 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20  LLBACKFUNC_t);. 
1e6c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e6d0 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20  3FaultSim(0);.  
1e6e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e6f0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e700 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e710 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
1e720 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
1e730 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
1e740 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
1e750 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
1e760 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
1e770 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1e780 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
1e790 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
1e7a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e7b0 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
1e7c0 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
1e7d0 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1e7e0 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
1e7f0 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
1e800 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1e810 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
1e820 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1e830 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
1e840 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
1e850 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1e860 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1e870 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
1e880 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1e890 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
1e8a0 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
1e8b0 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
1e8c0 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
1e8d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e8e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1e8f0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1e900 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1e910 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1e920 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
1e930 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1e940 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
1e950 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
1e960 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
1e970 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
1e980 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
1e990 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
1e9a0 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
1e9b0 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
1e9c0 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
1e9d0 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
1e9e0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1e9f0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
1ea00 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
1ea10 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
1ea20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1ea30 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
1ea40 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
1ea50 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
1ea60 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
1ea70 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
1ea80 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1ea90 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
1eaa0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
1eab0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
1eac0 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
1ead0 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
1eae0 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68   deleterious beh
1eaf0 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
1eb00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1eb10 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1eb20 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  YTE: {.      rc 
1eb30 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
1eb40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eb50 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a  MIT_WSD.      {.
1eb60 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1eb70 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
1eb80 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
1eb90 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  d int);.        
1eba0 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c  if( newVal ) sql
1ebb0 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20  ite3PendingByte 
1ebc0 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20  = newVal;.      
1ebd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1ebe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ebf0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1ec00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ec10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ec20 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a  _ASSERT, int X).
1ec30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ec40 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1ec50 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1ec60 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
1ec70 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  r or not.    ** 
1ec80 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61  assert() was ena
1ec90 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1eca0 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74  time.  If X is t
1ecb0 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  rue and assert()
1ecc0 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c  .    ** is enabl
1ecd0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1ece0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75  urn value is tru
1ecf0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1ed00 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65   and.    ** asse
1ed10 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1ed20 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1ed30 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1ed40 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a    If X is.    **
1ed50 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1ed60 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  t() is enabled, 
1ed70 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69  then the asserti
1ed80 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65  on fires and the
1ed90 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1eda0 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73  aborts.  If X is
1edb0 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1edc0 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1edd0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1ede0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1edf0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1ee00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ee10 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b  STCTRL_ASSERT: {
1ee20 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  .      volatile 
1ee30 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
1ee40 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d   assert( /*side-
1ee50 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20  effects-ok*/ (x 
1ee60 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1ee70 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
1ee80 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
1ee90 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1eea0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1eeb0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1eec0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1eed0 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
1eee0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1eef0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1ef00 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1ef10 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
1ef20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
1ef30 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
1ef40 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
1ef50 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
1ef60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1ef70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
1ef80 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69 73  LWAYS(X) if X is
1ef90 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58   true, or 0 if X
1efa0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1efb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1efc0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1efd0 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1efe0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1eff0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1f000 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1f010 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1f020 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1f030 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1f040 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1f050 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1f060 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1f070 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1f080 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1f090 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1f0a0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1f0b0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1f0c0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1f0d0 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1f0e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1f0f0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1f100 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1f110 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1f120 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f130 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1f140 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1f150 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1f160 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1f170 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1f180 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1f190 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1f1a0 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1f1b0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1f1c0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1f1d0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1f1e0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1f1f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f200 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1f210 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1f220 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1f230 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1f240 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1f250 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f260 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f270 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1f280 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1f290 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1f2a0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1f2b0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1f2c0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1f2d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( 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 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1f310 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1f320 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1f330 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1f340 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1f350 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
1f360 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
1f370 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1f380 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
1f390 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
1f3a0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1f3b0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
1f3c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f3d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f3e0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
1f3f0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1f400 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
1f410 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29   = x ? ALWAYS(x)
1f420 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1f430 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f440 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
1f450 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f460 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1f470 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
1f480 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
1f490 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
1f4a0 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
1f4b0 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
1f4c0 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
1f4d0 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
1f4e0 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
1f4f0 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
1f500 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1f510 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1f520 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1f530 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
1f540 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1f550 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1f560 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
1f570 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1f580 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1f590 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1f5a0 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
1f5b0 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1f5c0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1f5d0 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1f5e0 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
1f5f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1f600 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
1f610 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
1f620 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
1f630 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
1f640 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
1f650 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
1f660 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f670 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1f680 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f690 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
1f6a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1f6b0 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1f6c0 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
1f6d0 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
1f6e0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
1f6f0 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
1f700 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
1f710 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
1f720 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f730 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1f740 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1f750 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1f760 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1f770 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1f780 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1f790 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1f7a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1f7b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f7c0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1f7d0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
1f7e0 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
1f7f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f800 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1f810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f820 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1f830 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f840 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f850 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
1f860 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1f870 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1f880 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1f890 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
1f8a0 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
1f8b0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
1f8c0 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
1f8d0 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
1f8e0 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
1f8f0 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
1f900 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
1f910 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
1f920 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
1f930 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
1f940 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
1f950 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
1f960 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
1f970 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
1f980 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
1f990 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
1f9a0 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
1f9b0 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
1f9c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
1f9d0 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
1f9e0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
1f9f0 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
1fa00 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
1fa10 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
1fa20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1fa30 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1fa40 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
1fa50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1fa60 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1fa70 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
1fa80 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
1fa90 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
1faa0 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
1fab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fac0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1fad0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1fae0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1faf0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
1fb00 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
1fb10 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
1fb20 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
1fb30 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65 71 75 65  n-zero, subseque
1fb40 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
1fb50 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20 61  ltime().    ** a
1fb60 6e 64 20 69 74 73 20 76 61 72 69 61 6e 74 73 20  nd its variants 
1fb70 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
1fb80 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68 69  s zero, undo thi
1fb90 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
1fba0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1fbb0 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
1fbc0 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
1fbd0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1fbe0 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
1fbf0 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
1fc00 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1fc10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fc20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1fc30 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1fc40 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
1fc50 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e 74  ERNAL_FUNCS, int
1fc60 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
1fc70 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
1fc80 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
1fc90 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c 2d  -zero, internal-
1fca0 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75 6e  use-only SQL fun
1fcb0 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61 72  ctions.    ** ar
1fcc0 65 20 76 69 73 69 62 6c 65 20 74 6f 20 6f 72 64  e visible to ord
1fcd0 69 6e 61 72 79 20 53 51 4c 2e 20 20 54 68 69 73  inary SQL.  This
1fce0 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 74   is useful for t
1fcf0 65 73 74 69 6e 67 20 62 75 74 20 69 73 0a 20 20  esting but is.  
1fd00 20 20 2a 2a 20 75 6e 73 61 66 65 20 62 65 63 61    ** unsafe beca
1fd10 75 73 65 20 69 6e 76 61 6c 69 64 20 70 61 72 61  use invalid para
1fd20 6d 65 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20  meters to those 
1fd30 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c  internal-use-onl
1fd40 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  y functions.    
1fd50 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  ** can result in
1fd60 20 63 72 61 73 68 65 73 20 6f 72 20 73 65 67 66   crashes or segf
1fd70 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aults..    */.  
1fd80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1fd90 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f  STCTRL_INTERNAL_
1fda0 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  FUNCTIONS: {.   
1fdb0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1fdc0 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c  Config.bInternal
1fdd0 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f 61  Functions = va_a
1fde0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1fdf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fe00 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1fe10 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fe20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1fe30 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1fe40 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1fe50 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1fe60 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1fe70 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1fe80 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1fe90 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1fea0 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1feb0 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1fec0 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1fed0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1fee0 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1fef0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1ff00 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1ff10 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1ff20 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1ff30 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1ff40 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1ff50 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1ff60 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1ff70 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1ff80 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1ff90 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1ffa0 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1ffb0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1ffc0 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1ffd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ffe0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1fff0 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
20000 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
20010 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
20020 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
20030 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
20040 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20050 2a 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68  * Set the thresh
20060 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f  old at which OP_
20070 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65  Once counters re
20080 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f  set back to zero
20090 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61  ..    ** By defa
200a0 75 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66  ult this is 0x7f
200b0 66 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62  fffffe (over 2 b
200c0 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61  illion), but tha
200d0 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a  t value is.    *
200e0 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73  * too big to tes
200f0 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c  t in a reasonabl
20100 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
20110 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f  , so this contro
20120 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76  l is.    ** prov
20130 69 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d  ided to set a sm
20140 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72  all and easily r
20150 65 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76  eachable reset v
20160 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
20170 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20180 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54  TCTRL_ONCE_RESET
20190 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20  _THRESHOLD: {.  
201a0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
201b0 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73  lConfig.iOnceRes
201c0 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61  etThreshold = va
201d0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
201e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
201f0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
20200 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20210 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
20220 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
20230 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
20240 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
20250 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
20260 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
20270 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
20280 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
20290 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
202a0 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
202b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
202c0 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
202d0 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
202e0 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
202f0 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
20300 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
20310 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75  allback)(void*,u
20320 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20  nsigned int,.   
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
20360 2c 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b  ,unsigned char);
20370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
20380 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
20390 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
203a0 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
203b0 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
203c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
203d0 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
203e0 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
203f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
20400 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20410 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
20420 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20430 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
20440 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
20450 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
20460 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
20470 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
20480 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20490 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
204a0 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
204b0 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
204c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
204d0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
204e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
204f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
20500 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
20510 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
20520 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
20530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
20540 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
20550 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
20560 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
20570 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
20580 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20590 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
205a0 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
205b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
205c0 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
205d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
205e0 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
205f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20600 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20610 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20620 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
20630 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
20640 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
20650 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
20660 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
20670 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
20680 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
20690 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
206a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
206b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
206c0 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
206d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
206e0 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
206f0 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
20700 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
20710 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
20720 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
20730 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
20740 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
20750 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
20760 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
20770 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
20780 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
20790 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
207a0 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
207b0 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
207c0 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
207d0 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
207e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
207f0 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
20800 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
20810 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
20820 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
20830 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
20840 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
20850 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
20860 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
20870 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
20880 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
20890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
208a0 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
208b0 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
208c0 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
208d0 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
208e0 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
208f0 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
20900 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
20910 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
20920 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
20930 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
20940 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
20950 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
20960 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20970 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
20980 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
20990 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
209a0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
209b0 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
209c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
209d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
209e0 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
209f0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
20a00 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
20a10 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
20a20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
20a30 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
20a40 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
20a50 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
20a60 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
20a70 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
20a80 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
20a90 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
20aa0 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
20ab0 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
20ac0 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
20ad0 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
20ae0 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
20af0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
20b00 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
20b10 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
20b20 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
20b30 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
20b40 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  GE).    /*  sqli
20b50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20b60 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
20b70 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
20b80 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20  , FILE *out).   
20b90 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
20ba0 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e  test control (on
20bb0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65  ly available whe
20bc0 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  n SQLite is comp
20bd0 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  iled with.    **
20be0 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77   -DYYCOVERAGE) w
20bf0 72 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f  rites a report o
20c00 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73  nto "out" that s
20c10 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  hows all.    ** 
20c20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20  state/lookahead 
20c30 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20  combinations in 
20c40 74 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65  the parser state
20c50 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20   machine.    ** 
20c60 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
20c70 65 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61  exercised.  If a
20c80 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73  ny state is miss
20c90 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  ed, make the.   
20ca0 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20   ** return code 
20cb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
20cc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20cd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
20ce0 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b  RSER_COVERAGE: {
20cf0 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
20d00 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49   = va_arg(ap, FI
20d10 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE*);.      if( 
20d20 73 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76  sqlite3ParserCov
20d30 65 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20  erage(out) ) rc 
20d40 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
20d50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d60 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
20d70 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
20d80 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   */.  }.  va_end
20d90 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
20da0 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c  SQLITE_UNTESTABL
20db0 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  E */.  return rc
20dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20dd0 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
20de0 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
20df0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
20e00 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
20e10 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
20e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
20e30 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
20e40 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
20e50 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
20e60 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
20e70 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
20e80 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
20e90 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
20ea0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
20eb0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
20ec0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
20ed0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
20ee0 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
20ef0 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
20f00 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
20f10 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
20f20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
20f30 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
20f40 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
20f50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
20f60 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
20f70 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
20f80 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
20f90 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
20fa0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
20fb0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
20fc0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
20fd0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
20fe0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
20ff0 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
21000 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
21010 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
21020 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
21030 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
21040 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
21050 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21060 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
21070 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
21080 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
21090 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
210a0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
210b0 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
210c0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
210d0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
210e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
210f0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
21100 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
21110 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
21120 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
21130 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
21140 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
21150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21170 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
21180 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
21190 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
211a0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
211b0 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
211c0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
211d0 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
211e0 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
211f0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
21200 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
21210 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
21220 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
21230 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
21240 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
21250 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
21260 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
21270 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
21280 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
21290 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
212a0 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
212b0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
212c0 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
212d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
212e0 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
212f0 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
21300 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
21310 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
21320 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
21330 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
21340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
21350 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
21360 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
21370 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
21380 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
21390 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
213a0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
213b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
213c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
213d0 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
213e0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
213f0 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20  ToI64(z, &v)==0 
21400 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
21410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
21420 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
21430 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
21440 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
21450 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
21460 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
21470 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
21480 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
21490 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
214a0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
214b0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
214c0 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
214d0 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
214e0 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
214f0 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
21500 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
21510 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
21520 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21530 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
21540 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
21550 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
21560 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
21570 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
21580 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
21590 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
215a0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
215b0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
215c0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
215d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
215e0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
215f0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
21600 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
21610 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
21620 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
21630 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
21640 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
21650 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
21660 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
21670 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
21680 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
21690 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
216a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
216b0 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
216c0 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
216d0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
216e0 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
216f0 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
21700 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
21710 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
21720 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
21730 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
21740 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
21750 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21760 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
21770 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
21780 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
21790 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
217a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
217b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
217c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
217d0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
217e0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
217f0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
21800 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
21810 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
21820 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  ) : -1;.}..#ifde
21830 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21840 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f  SNAPSHOT./*.** O
21850 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74  btain a snapshot
21860 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
21870 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61  snapshot of data
21880 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74  base zDb current
21890 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61  ly .** being rea
218a0 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a  d by handle db..
218b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
218c0 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73  napshot_get(.  s
218d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
218e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
218f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
21900 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a  ot **ppSnapshot.
21910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21920 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
21930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21940 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
21950 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
21960 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
21970 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
21980 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
21990 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
219a0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
219b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
219c0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
219d0 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  );..  if( db->au
219e0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
219f0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
21a00 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
21a10 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
21a20 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
21a30 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
21a40 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
21a50 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
21a60 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
21a70 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
21a80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
21aa0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20  inTrans(pBt, 0, 
21ab0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
21ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21ad0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21ae0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
21af0 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42  shotGet(sqlite3B
21b00 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
21b10 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20  ppSnapshot);.   
21b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21b30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
21b40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21b50 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
21b60 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
21b70 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
21b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21b90 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
21ba0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21bb0 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66  snapshot idendif
21bc0 69 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74  ied by pSnapshot
21bd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21be0 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a  _snapshot_open(.
21bf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
21c00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21c10 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b, .  sqlite3_sn
21c20 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
21c30 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
21c40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
21c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21c60 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
21c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
21c80 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
21c90 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
21ca0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
21cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
21cc0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
21cd0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
21ce0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21cf0 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  ex);.  if( db->a
21d00 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
21d10 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
21d20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
21d30 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
21d40 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
21d50 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
21d60 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
21d70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
21d80 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
21d90 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
21da0 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  ns(pBt)==0 ){.  
21db0 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
21dc0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
21dd0 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
21de0 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 63        int bUnloc
21df0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
21e00 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
21e10 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
21e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
21e30 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
21e40 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ve==0 ){.       
21e50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21e60 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 43 68  3PagerSnapshotCh
21e70 65 63 6b 28 70 50 61 67 65 72 2c 20 70 53 6e 61  eck(pPager, pSna
21e80 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
21e90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21eb0 20 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b 20 3d         bUnlock =
21ec0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
21ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21ee0 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21f30 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
21f40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21f60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21f70 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
21f80 6e 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73  n(pPager, pSnaps
21f90 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
21fa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21fc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21fd0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
21fe0 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
21ff0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22000 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
22010 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
22020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22030 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b 0a 20  if( bUnlock ){. 
22040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22050 50 61 67 65 72 53 6e 61 70 73 68 6f 74 55 6e 6c  PagerSnapshotUnl
22060 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
22070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22080 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
22090 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
220a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
220b0 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
220c0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
220d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
220e0 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79   Recover as many
220f0 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f   snapshots as po
22100 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
22110 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
22120 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65  ted with.** sche
22130 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61  ma zDb of databa
22140 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  se db..*/.int sq
22150 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
22160 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a  ecover(sqlite3 *
22170 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
22180 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  zDb){.  int rc =
22190 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
221a0 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65   int iDb;.#ifnde
221b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
221c0 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
221d0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
221e0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
221f0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
22200 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
22210 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
22220 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
22230 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22240 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
22250 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
22260 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
22270 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d  zDb);.  if( iDb=
22280 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20  =0 || iDb>1 ){. 
22290 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
222a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
222b0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
222c0 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
222d0 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
222e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
222f0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
22300 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
22310 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22330 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22340 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72  rSnapshotRecover
22350 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
22360 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
22370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
22380 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
22390 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
223a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
223b0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
223c0 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
223d0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
223e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
223f0 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73  .** Free a snaps
22400 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  hot handle obtai
22410 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22420 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e  _snapshot_get().
22430 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22440 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73  _snapshot_free(s
22450 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
22460 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73  *pSnapshot){.  s
22470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61  qlite3_free(pSna
22480 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pshot);.}.#endif
22490 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
224a0 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 53  E_SNAPSHOT */..S
224b0 51 4c 49 54 45 5f 45 58 50 45 52 49 4d 45 4e 54  QLITE_EXPERIMENT
224c0 41 4c 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  AL int sqlite3_w
224d0 61 6c 5f 69 6e 66 6f 28 0a 20 20 73 71 6c 69 74  al_info(.  sqlit
224e0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
224f0 61 72 20 2a 7a 44 62 2c 20 0a 20 20 75 6e 73 69  ar *zDb, .  unsi
22500 67 6e 65 64 20 69 6e 74 20 2a 70 6e 50 72 69 6f  gned int *pnPrio
22510 72 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r, unsigned int 
22520 2a 70 6e 46 72 61 6d 65 0a 29 7b 0a 20 20 69 6e  *pnFrame.){.  in
22530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22540 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
22550 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 42 74 72  E_OMIT_WAL.  Btr
22560 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69  ee *pBt;.  int i
22570 44 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Db;..#ifdef SQLI
22580 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
22590 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
225a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
225b0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
225c0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
225d0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
225e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
225f0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
22600 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  x);.  iDb = sqli
22610 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
22620 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44  , zDb);.  if( iD
22630 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
22640 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
22650 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e    }.  pBt = db->
22660 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
22670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22680 72 57 61 6c 49 6e 66 6f 28 73 71 6c 69 74 65 33  rWalInfo(sqlite3
22690 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c  BtreePager(pBt),
226a0 20 70 6e 50 72 69 6f 72 2c 20 70 6e 46 72 61 6d   pnPrior, pnFram
226b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e);.  sqlite3_mu
226c0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
226d0 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
226e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
226f0 4c 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72  L */..  return r
22700 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
22710 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
22720 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a  EOPTION_DIAGS./*
22730 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
22740 6d 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d  me of a compile-
22750 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74  time option, ret
22760 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 61 74  urn true if that
22770 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75   option.** was u
22780 73 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66  sed and false if
22790 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   not..**.** The 
227a0 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61  name can optiona
227b0 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20 22  lly begin with "
227c0 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74 68 65  SQLITE_" but the
227d0 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65 66 69   "SQLITE_" prefi
227e0 78 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  x.** is not requ
227f0 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74 63 68  ired for a match
22800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22810 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
22820 73 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sed(const char *
22830 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  zOptName){.  int
22840 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70   i, n;.  int nOp
22850 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
22860 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a  **azCompileOpt;.
22870 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
22880 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
22890 69 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20  if( zOptName==0 
228a0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
228b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
228c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
228d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43   }.#endif..  azC
228e0 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69  ompileOpt = sqli
228f0 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  te3CompileOption
22900 73 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28  s(&nOpt);..  if(
22910 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
22920 28 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49  (zOptName, "SQLI
22930 54 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f  TE_", 7)==0 ) zO
22940 70 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e  ptName += 7;.  n
22950 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
22960 33 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20  30(zOptName);.. 
22970 20 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74 20 69   /* Since nOpt i
22980 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69  s normally in si
22990 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 61 20 6c  ngle digits, a l
229a0 69 6e 65 61 72 20 73 65 61 72 63 68 20 69 73 20  inear search is 
229b0 0a 20 20 2a 2a 20 61 64 65 71 75 61 74 65 2e 20  .  ** adequate. 
229c0 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  No need for a bi
229d0 6e 61 72 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a  nary search. */.
229e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
229f0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
22a00 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
22a10 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d  (zOptName, azCom
22a20 70 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d  pileOpt[i], n)==
22a30 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
22a40 33 49 73 49 64 43 68 61 72 28 28 75 6e 73 69 67  3IsIdChar((unsig
22a50 6e 65 64 20 63 68 61 72 29 61 7a 43 6f 6d 70 69  ned char)azCompi
22a60 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a  leOpt[i][n])==0.
22a70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
22a80 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22a90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22aa0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22ab0 20 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69   N-th compile-ti
22ac0 6d 65 20 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67  me option string
22ad0 2e 20 20 49 66 20 4e 20 69 73 20 6f 75 74 20 6f  .  If N is out o
22ae0 66 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75  f range,.** retu
22af0 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  rn a NULL pointe
22b00 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
22b10 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c   *sqlite3_compil
22b20 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20  eoption_get(int 
22b30 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a  N){.  int nOpt;.
22b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
22b50 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61  zCompileOpt;.  a
22b60 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71  zCompileOpt = sq
22b70 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69  lite3CompileOpti
22b80 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66  ons(&nOpt);.  if
22b90 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74  ( N>=0 && N<nOpt
22ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
22bb0 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a  zCompileOpt[N];.
22bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22bd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22be0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
22bf0 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a     PTION_DIAGS */.