/ Hex Artifact Content
Login

Artifact 23f7d6395e30d9fbd2abfe4e5bae6c9bf8ce5e854d15e934ca9571c22eb3eef5:


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 33 32 20 6f 6c 64 46 6c         u32 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 61 46  db->flags &= ~aF
7420: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
7430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7440: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
7450: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
7460: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7470: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
7480: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20  dStatements(db, 
7490: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
74a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
74b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
74c0: 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66    *pRes = (db->f
74d0: 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69  lags & aFlagOp[i
74e0: 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20  ].mask)!=0;.    
74f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7500: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7510: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7520: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7530: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
7550: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
7560: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
7570: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7580: 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e  the buffer z[0..
7590: 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c  n-1] contains al
75a0: 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  l spaces..*/.sta
75b0: 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65  tic int allSpace
75c0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  s(const char *z,
75d0: 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65   int n){.  while
75e0: 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>0 && z[n-1]=
75f0: 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  =' ' ){ n--; }. 
7600: 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a   return n==0;.}.
7610: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
7620: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
7630: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ting function na
7640: 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69  med "BINARY" whi
7650: 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  ch is always.** 
7660: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
7670: 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20   If the padFlag 
7680: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
7690: 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20  NULL then space 
76a0: 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65  padding at the e
76b0: 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73  nd.** of strings
76c0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   is ignored.  Th
76d0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  is implements th
76e0: 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f  e RTRIM collatio
76f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
7700: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20   binCollFunc(.  
7710: 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20  void *padFlag,. 
7720: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
7730: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
7740: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
7750: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
7760: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
7770: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
7780: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
7790: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
77a0: 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39  F: R-65033-28449
77b0: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49   The built-in BI
77c0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  NARY collation c
77d0: 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72  ompares.  ** str
77e0: 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74  ings byte by byt
77f0: 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63  e using the memc
7800: 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72  mp() function fr
7810: 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
7820: 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20  C.  ** library. 
7830: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  */.  assert( pKe
7840: 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a 20  y1 && pKey2 );. 
7850: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
7860: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
7870: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
7880: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
7890: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
78a0: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
78b0: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
78c0: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
78d0: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
78e0: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
78f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
7900: 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37  -OF: R-31624-247
7910: 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65  37 RTRIM is like
7920: 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20 74   BINARY except t
7930: 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20 20  hat extra.      
7940: 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68 65  ** spaces at the
7950: 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73   end of either s
7960: 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61  tring do not cha
7970: 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20  nge the result. 
7980: 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  In other.      *
7990: 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73  * words, strings
79a0: 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71   will compare eq
79b0: 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ual to one anoth
79c0: 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  er as long as th
79d0: 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66  ey.      ** diff
79e0: 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e  er only in the n
79f0: 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73 20  umber of spaces 
7a00: 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20  at the end..    
7a10: 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
7a20: 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31        rc = nKey1
7a30: 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a   - nKey2;.    }.
7a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7a60: 20 74 72 75 65 20 69 66 20 43 6f 6c 6c 53 65 71   true if CollSeq
7a70: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
7a80: 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 2e  built-in BINARY.
7a90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7aa0: 73 42 69 6e 61 72 79 28 63 6f 6e 73 74 20 43 6f  sBinary(const Co
7ab0: 6c 6c 53 65 71 20 2a 70 29 7b 0a 20 20 61 73 73  llSeq *p){.  ass
7ac0: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
7ad0: 78 43 6d 70 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e  xCmp!=binCollFun
7ae0: 63 20 7c 7c 20 70 2d 3e 70 55 73 65 72 21 3d 30  c || p->pUser!=0
7af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
7b00: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
7b10: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 3b 0a  "BINARY")==0 );.
7b20: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
7b30: 20 28 70 2d 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f   (p->xCmp==binCo
7b40: 6c 6c 46 75 6e 63 20 26 26 20 70 2d 3e 70 55 73  llFunc && p->pUs
7b50: 65 72 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er==0);.}../*.**
7b60: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
7b70: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
7b80: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
7b90: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
7ba0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
7bb0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
7bc0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
7bd0: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
7be0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
7bf0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
7c00: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
7c10: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
7c20: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
7c30: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
7c40: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
7c50: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
7c60: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
7c70: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
7c80: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
7c90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
7ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
7cb0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
7cc0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7cd0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7ce0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7cf0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7d00: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7d10: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
7d20: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
7d30: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
7d40: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
7d50: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
7d60: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
7d70: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
7d80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
7d90: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
7da0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
7db0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7dc0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7dd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7de0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7df0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7e00: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7e10: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7e20: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7e30: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7e50: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7e60: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7e70: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7e80: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7e90: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7ea0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
7eb0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7ec0: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7ed0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 72   Set the value r
7ee0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
7ef0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7f00: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
7f10: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
7f20: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61 73   sqlite3_set_las
7f30: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7f40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7f50: 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
7f60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7f70: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7f80: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7f90: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7fa0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7fb0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7fc0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
7fd0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
7fe0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7ff0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
8000: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  ->lastRowid = iR
8010: 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  owid;.  sqlite3_
8020: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8030: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
8040: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8050: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
8060: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8070: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8080: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
8090: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
80a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
80b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
80c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
80d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
80e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
80f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
8100: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8120: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8130: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
8140: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8150: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
8160: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
8170: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
8180: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
8190: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
81a0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
81b0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
81c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
81d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
81e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
81f0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
8200: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8210: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
8220: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8230: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
8240: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
8250: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
8260: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
8270: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
8280: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
8290: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
82a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
82b0: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
82c0: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
82d0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
82e0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
82f0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
8300: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
8310: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
8320: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
8330: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
8340: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
8350: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
8360: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
8370: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
8380: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
8390: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
83a0: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
83b0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
83c0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
83d0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
83e0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
83f0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
8400: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
8410: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
8420: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
8430: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
8440: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
8450: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
8460: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
8470: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
8480: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
8490: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
84a0: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
84b0: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
84c0: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
84d0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
84e0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
84f0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
8500: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
8510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8520: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
8530: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
8540: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
8550: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
8560: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75 2e  structor = p->u.
8570: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
8580: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
8590: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
85a0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
85b0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
85c0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
85d0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
85e0: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
85f0: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
8600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8610: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
8620: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
8630: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
8640: 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ect all sqlite3_
8650: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61  vtab objects tha
8660: 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61  t belong to data
8670: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
8680: 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63  ** db. This is c
8690: 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73  alled when db is
86a0: 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a   being closed..*
86b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
86c0: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
86d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
86e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8700: 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c   int i;.  HashEl
8710: 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  em *p;.  sqlite3
8720: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
8730: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8740: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
8750: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
8760: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
8770: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
8780: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
8790: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
87a0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
87b0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
87c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
87d0: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
87e0: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
87f0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8800: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
8810: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8820: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
8830: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8840: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
8850: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
8860: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8870: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
8880: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
8890: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
88a0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
88b0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
88c0: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
88d0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
88e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
88f0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8900: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
8910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8920: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
8930: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
8940: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
8950: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
8960: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
8970: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8980: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8990: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
89a0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
89b0: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
89c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
89d0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
89e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
89f0: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
8a00: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
8a10: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
8a20: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
8a30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a40: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
8a50: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
8a60: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
8a70: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
8a80: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
8a90: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8aa0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
8ab0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
8ac0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
8ad0: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
8ae0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
8af0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8b00: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8b10: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8b20: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8b30: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8b40: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
8b50: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
8b60: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
8b70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8b80: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
8b90: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
8ba0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
8bb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
8bc0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
8bd0: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
8be0: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
8bf0: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8c10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8c20: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8c30: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8c40: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
8c50: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
8c60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8c70: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8c80: 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26  if( db->mTrace &
8c90: 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
8ca0: 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  OSE ){.    db->x
8cb0: 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41  Trace(SQLITE_TRA
8cc0: 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54  CE_CLOSE, db->pT
8cd0: 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b  raceArg, db, 0);
8ce0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65  .  }..  /* Force
8cf0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c   xDisconnect cal
8d00: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
8d10: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69  l tables */.  di
8d20: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8d30: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  db);..  /* If a 
8d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
8d50: 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e  pen, the disconn
8d60: 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c  ectAllVtab() cal
8d70: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
8d80: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
8d90: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
8da0: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
8db0: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
8dc0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
8dd0: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
8de0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
8df0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8e00: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
8e10: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
8e20: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
8e30: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
8e40: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
8e50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
8e60: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
8e70: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
8e80: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
8e90: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
8ea0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
8eb0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
8ec0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
8ed0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
8ee0: 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69  /* Legacy behavi
8ef0: 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or (sqlite3_clos
8f00: 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73  e() behavior) is
8f10: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
8f20: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74  SQLITE_BUSY if t
8f30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
8f40: 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  n not be closed 
8f50: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
8f60: 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f  /.  if( !forceZo
8f70: 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69  mbie && connecti
8f80: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
8f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8fa0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
8fb0: 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65  TE_BUSY, "unable
8fc0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
8fd0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20   unfinalized ". 
8fe0: 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74        "statement
8ff0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
9000: 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73  backups");.    s
9010: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9020: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9040: 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64  _BUSY;.  }..#ifd
9050: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9060: 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
9070: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9080: 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
9090: 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20   /* Closing the 
90a0: 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
90b0: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
90c0: 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20  ed the value 2. 
90d0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  */.    sqlite3Gl
90e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
90f0: 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  og(sqlite3Global
9100: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
9110: 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20  g, db, 0, 2);.  
9120: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
9130: 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65  onvert the conne
9140: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d  ction into a zom
9150: 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f  bie and then clo
9160: 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62  se it..  */.  db
9170: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
9180: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20  _MAGIC_ZOMBIE;. 
9190: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
91a0: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
91b0: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
91c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
91d0: 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e  ** Two variation
91e0: 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s on the public 
91f0: 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c  interface for cl
9200: 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  osing a database
9210: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  .** connection. 
9220: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
9230: 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75  e() version retu
9240: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20  rns SQLITE_BUSY 
9250: 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68  and.** leaves th
9260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74  e connection opt
9270: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
9280: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
9290: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
92a0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
92b0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
92c0: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
92d0: 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65  close_v2().** ve
92e0: 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65  rsion forces the
92f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
9300: 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69  ecome a zombie i
9310: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75  f there are.** u
9320: 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65  nclosed resource
9330: 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20  s, and arranges 
9340: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  for deallocation
9350: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a   when the last.*
9360: 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  * prepare statem
9370: 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  ent or sqlite3_b
9380: 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f  ackup closes..*/
9390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
93a0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
93b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
93c0: 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e  lose(db,0); }.in
93d0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  t sqlite3_close_
93e0: 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  v2(sqlite3 *db){
93f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
9400: 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a  lose(db,1); }...
9410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
9420: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
9430: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
9440: 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  .**.** Furthermo
9450: 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20  re, if database 
9460: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
9470: 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69   a zombie (meani
9480: 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a  ng that there.**
9490: 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f   has been a prio
94a0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
94b0: 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73  3_close(db) or s
94c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
94d0: 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72  db)) and.** ever
94e0: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68  y sqlite3_stmt h
94f0: 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61  as now been fina
9500: 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20  lized and every 
9510: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68  sqlite3_backup h
9520: 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20  as.** finished, 
9530: 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65  then free all re
9540: 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  sources..*/.void
9550: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
9560: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
9570: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9580: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
95b0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
95c0: 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   j;..  /* If the
95d0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
95e0: 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ng sqlite3_stmt 
95f0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
9600: 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f  p objects.  ** o
9610: 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  r if the connect
9620: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
9630: 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73  been closed by s
9640: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
9650: 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73  ),.  ** then jus
9660: 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65  t leave the mute
9670: 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  x and return..  
9680: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67  */.  if( db->mag
9690: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
96a0: 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65  _ZOMBIE || conne
96b0: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
96c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
96d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
96e0: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
96f0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
9700: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
9710: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
9720: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
9730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20  connection has. 
9740: 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73   ** closed all s
9750: 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20  qlite3_stmt and 
9760: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
9770: 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62  bjects and has b
9780: 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20  een.  ** passed 
9790: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
97a0: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69   (meaning that i
97b0: 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20  t is a zombie). 
97c0: 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a   Therefore,.  **
97d0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72   go ahead and fr
97e0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
97f0: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ..  */..  /* If 
9800: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9810: 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62   open, roll it b
9820: 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65  ack. This also e
9830: 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20  nsures that if. 
9840: 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65   ** any database
9850: 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65   schemas have be
9860: 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61  en modified by a
9870: 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72  n uncommitted tr
9880: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74  ansaction.  ** t
9890: 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41  hey are reset. A
98a0: 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75  nd that the requ
98b0: 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ired b-tree mute
98c0: 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b  x is held to mak
98d0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  e.  ** the pager
98e0: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
98f0: 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74  hema reset an at
9900: 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20  omic operation. 
9910: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c  */.  sqlite3Roll
9920: 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
9930: 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72  TE_OK);..  /* Fr
9940: 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  ee any outstandi
9950: 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72  ng Savepoint str
9960: 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71  uctures. */.  sq
9970: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
9980: 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ints(db);..  /* 
9990: 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61  Close all databa
99a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
99b0: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  /.  for(j=0; j<d
99c0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
99d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
99e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
99f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
9a00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9a10: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
9a20: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
9a30: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
9a40: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
9a50: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
9a60: 6d 61 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  maDisconnect(db,
9a70: 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   j, 0);.        
9a80: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
9a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9aa0: 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74    }.  /* Clear t
9ab0: 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73  he TEMP schema s
9ac0: 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61  eparately and la
9ad0: 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  st */.  if( db->
9ae0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
9af0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  {.    sqlite3Sch
9b00: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
9b10: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
9b20: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
9b30: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a  nlockList(db);..
9b40: 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65    /* Free up the
9b50: 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69   array of auxili
9b60: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ary databases */
9b70: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
9b80: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
9b90: 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
9ba0: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
9bb0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
9bc0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
9bd0: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
9be0: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
9bf0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
9c00: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
9c10: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
9c20: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
9c30: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
9c40: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
9c50: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
9c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
9c70: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
9c80: 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  ;..  for(i=sqlit
9c90: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9ca0: 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c  aFunc); i; i=sql
9cb0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9cc0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
9cd0: 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ext, *p;.    p =
9ce0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
9cf0: 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  i);.    do{.    
9d00: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
9d10: 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  y(db, p);.      
9d20: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
9d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9d40: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
9d50: 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20      p = pNext;. 
9d60: 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a     }while( p );.
9d70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
9d80: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e  hClear(&db->aFun
9d90: 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  c);.  for(i=sqli
9da0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9db0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
9dc0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9dd0: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
9de0: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
9df0: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
9e00: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
9e10: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
9e20: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
9e30: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
9e40: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
9e50: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
9e60: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
9e70: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
9e80: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
9e90: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
9ea0: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
9eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ec0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9ed0: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
9ee0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9ef0: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
9f00: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9f10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9f20: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
9f30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9f40: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
9f50: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9f60: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
9f70: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
9f80: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9f90: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
9fa0: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
9fb0: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
9fc0: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
9fd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9fe0: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
9ff0: 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f  bleClear(db, pMo
a000: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  d);.    sqlite3D
a010: 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b  bFree(db, pMod);
a020: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
a030: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f  shClear(&db->aMo
a040: 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
a050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
a060: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a  , SQLITE_OK); /*
a070: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
a080: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
a090: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  rings. */.  sqli
a0a0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d  te3ValueFree(db-
a0b0: 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  >pErr);.  sqlite
a0c0: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
a0d0: 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  (db);.#if SQLITE
a0e0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
a0f0: 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66  TION.  sqlite3_f
a100: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
a110: 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74  thUser);.  sqlit
a120: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
a130: 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69  .zAuthPW);.#endi
a140: 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  f..  db->magic =
a150: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
a160: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
a170: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
a180: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
a190: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
a1a0: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
a1b0: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
a1c0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
a1d0: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
a1e0: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
a1f0: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
a200: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
a210: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
a220: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
a230: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
a240: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
a250: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
a260: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
a270: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
a280: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
a290: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
a2a0: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
a2b0: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
a2c0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
a2d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a2e0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
a2f0: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
a300: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
a310: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
a320: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
a330: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
a340: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
a350: 55 73 65 64 28 64 62 2c 30 29 3d 3d 30 20 29 3b  Used(db,0)==0 );
a360: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
a370: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
a380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a390: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
a3a0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
a3b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
a3c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
a3d0: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
a3e0: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
a3f0: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
a400: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
a410: 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ny write cursors
a420: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
a430: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
a440: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
a450: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
a460: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
a470: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
a480: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
a490: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
a4a0: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
a4b0: 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20  t cursor.  Read 
a4c0: 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f  cursors remain o
a4d0: 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a  pen and valid.**
a4e0: 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22   but are "saved"
a4f0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62   in case the tab
a500: 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76  le pages are mov
a510: 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f  ed around..*/.vo
a520: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
a530: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
a540: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
a550: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
a560: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
a570: 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65  int schemaChange
a580: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a590: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
a5a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
a5b0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
a5c0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
a5d0: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
a5e0: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
a5f0: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
a600: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
a610: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
a620: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
a630: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
a640: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
a650: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
a660: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
a670: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
a680: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
a690: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
a6a0: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
a6b0: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
a6c0: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
a6d0: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
a6e0: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
a6f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
a700: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
a710: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
a720: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
a730: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
a740: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
a750: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
a760: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
a770: 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61  db);.  schemaCha
a780: 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c  nge = (db->mDbFl
a790: 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68  ags & DBFLAG_Sch
a7a0: 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 20 26 26  emaChange)!=0 &&
a7b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a7c0: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
a7d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
a7e0: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
a7f0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
a800: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
a810: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
a820: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
a830: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
a840: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
a850: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
a860: 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69  eRollback(p, tri
a870: 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68  pCode, !schemaCh
a880: 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ange);.    }.  }
a890: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
a8a0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
a8b0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
a8c0: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 73  lloc();..  if( s
a8d0: 63 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20  chemaChange ){. 
a8e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
a8f0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
a900: 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 73  ts(db, 0);.    s
a910: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
a920: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
a930: 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n(db);.  }.  sql
a940: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
a950: 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79  l(db);..  /* Any
a960: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
a970: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
a980: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
a990: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d  solved. */.  db-
a9a0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
a9b0: 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   0;.  db->nDefer
a9c0: 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
a9d0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a9e0: 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
a9f0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61  ..  /* If one ha
aa00: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
aa10: 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f  d, invoke the ro
aa20: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c  llback-hook call
aa30: 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  back */.  if( db
aa40: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
aa50: 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20  ack && (inTrans 
aa60: 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  || !db->autoComm
aa70: 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  it) ){.    db->x
aa80: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
aa90: 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72  (db->pRollbackAr
aaa0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
aab0: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
aac0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
aad0: 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72  ng the name corr
aae0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
aaf0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73   error code.** s
ab00: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
ab10: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
ab20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
ab30: 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63  NEED_ERR_NAME).c
ab40: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
ab50: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63  e3ErrName(int rc
ab60: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
ab70: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
ab80: 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63  t i, origRc = rc
ab90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
aba0: 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b   && zName==0; i+
abb0: 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a  +, rc &= 0xff){.
abc0: 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29      switch( rc )
abd0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
abe0: 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20  ITE_OK:         
abf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ac00: 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20  "SQLITE_OK";    
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ac20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac30: 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20  LITE_ERROR:     
ac40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ac50: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b   "SQLITE_ERROR";
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
ac70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ac80: 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50  QLITE_ERROR_SNAP
ac90: 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SHOT:     zName 
aca0: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  = "SQLITE_ERROR_
acb0: 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 62 72  SNAPSHOT";    br
acc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
acd0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
ace0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
acf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
ad00: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
ad10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad20: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ad40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
ad50: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
ad60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ad70: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ad90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
ada0: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
adb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
adc0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
add0: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
ade0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
adf0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
ae00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae10: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
ae30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
ae40: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
ae50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae60: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
ae70: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
ae80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ae90: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
aea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aeb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
aec0: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
aed0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aee0: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
aef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
af10: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
af20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
af30: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
af40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
af60: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
af70: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
af80: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
af90: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
afa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
afb0: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
afc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
afd0: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
afe0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aff0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b000: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
b010: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b020: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
b030: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b040: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b050: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
b060: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
b070: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b080: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
b090: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b0a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
b0b0: 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  INIT:  zName = "
b0c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b0d0: 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65 61 6b  CANTINIT"; break
b0e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
b100: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
b110: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b120: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
b130: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b140: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
b150: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
b160: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b170: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
b180: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b190: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
b1a0: 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d 65 20  IRECTORY: zName 
b1b0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b1c0: 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b 62 72  LY_DIRECTORY";br
b1d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b1e0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
b1f0: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
b200: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
b210: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
b220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b230: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
b240: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b250: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b260: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
b270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b280: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
b290: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
b2a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b2b0: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
b2c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b2d0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b2e0: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
b2f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b300: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
b310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b320: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b330: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
b340: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b350: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
b360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b370: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b380: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
b390: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b3a0: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
b3b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b3c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b3d0: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
b3e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3f0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
b400: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
b410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b420: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
b430: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b440: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
b450: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b460: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b470: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
b480: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b490: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
b4a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b4b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b4c0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
b4d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4e0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b4f0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b500: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b510: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
b520: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b530: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
b540: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
b550: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b560: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
b570: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b580: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b590: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
b5a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b5b0: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
b5c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b5d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
b5e0: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
b5f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b600: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
b610: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b620: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
b630: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
b640: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b650: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b660: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b690: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b6a0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b6b0: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
b6c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b6d0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
b6e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b6f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
b700: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
b710: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b720: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
b730: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b740: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b750: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
b760: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b770: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b780: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
b790: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b7a0: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
b7b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b7c0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b7d0: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
b7e0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b7f0: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
b800: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b810: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b820: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
b830: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b840: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
b850: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b860: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b870: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
b880: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b890: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
b8a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b8c0: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
b8d0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b8e0: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
b8f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b900: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
b910: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
b920: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b930: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
b940: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b950: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b960: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
b970: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b980: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
b990: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b9a0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b9b0: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
b9c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b9d0: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
b9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b9f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ba00: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
ba10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ba20: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
ba30: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
ba40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ba50: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
ba60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba70: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
ba80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ba90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
baa0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
bab0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bac0: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
bad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bae0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
baf0: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
bb00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bb10: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
bb20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bb40: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
bb50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bb60: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
bb70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bb80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bb90: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
bba0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bbb0: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
bbc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bbd0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bbe0: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
bbf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bc00: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
bc10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bc20: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc30: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
bc40: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
bc50: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
bc60: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
bc70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bc80: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
bc90: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
bca0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bcb0: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
bcc0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bcd0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
bce0: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
bcf0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
bd00: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
bd10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bd20: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
bd30: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
bd40: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bd50: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
bd60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bd70: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
bd80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bd90: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
bda0: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
bdb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bdc0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
bdd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bde0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
bdf0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
be00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be10: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
be20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
be30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
be40: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
be50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be60: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
be80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
be90: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
bea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
beb0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bec0: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
bed0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bee0: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
bef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bf10: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
bf20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf30: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
bf40: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bf50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bf60: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
bf70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf80: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
bf90: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
bfa0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bfb0: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
bfc0: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bff0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
c000: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
c010: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c020: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c030: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
c040: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c050: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
c060: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c070: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c080: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c0b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c0c0: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
c0d0: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
c0e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c0f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
c100: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
c110: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c120: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
c130: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c140: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
c150: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c180: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c190: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
c1a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c1b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c1c0: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
c1d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c1e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c1f0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
c200: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c210: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
c220: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c250: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
c260: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
c270: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c280: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c290: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
c2a0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c2b0: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
c2c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c2d0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
c2e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c2f0: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
c300: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
c310: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c320: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
c330: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c340: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
c350: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
c360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c370: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c390: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
c3a0: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
c3b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c3c0: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c3e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
c3f0: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
c400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c410: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
c420: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
c430: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
c440: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
c450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c460: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
c470: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
c480: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c490: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
c4a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c4b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c4c0: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
c4d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c4e0: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
c4f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c500: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
c510: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
c520: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c530: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
c540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c550: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c560: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
c570: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c580: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
c590: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c5a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c5b0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
c5c0: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
c5d0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c5e0: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
c5f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c600: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c610: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c640: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
c650: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
c660: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
c670: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
c680: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
c690: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c6a0: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
c6b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c6c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
c6d0: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
c6e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c6f0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c700: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
c710: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
c720: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
c730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c740: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
c750: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
c770: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
c780: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
c790: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c7a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c7b0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
c7c0: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
c7d0: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
c7e0: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
c7f0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
c800: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c810: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
c820: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
c830: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
c840: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
c850: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
c860: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
c870: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
c880: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
c890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c8a0: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
c8b0: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
c8c0: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
c8d0: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
c8e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c8f0: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
c900: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 22 2c  QL logic error",
c910: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
c920: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
c930: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
c940: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
c950: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
c960: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c970: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
c980: 20 20 20 20 2a 2f 20 22 71 75 65 72 79 20 61 62      */ "query ab
c990: 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  orted",.    /* S
c9a0: 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20  QLITE_BUSY      
c9b0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69    */ "database i
c9c0: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
c9d0: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  * SQLITE_LOCKED 
c9e0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c9f0: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
ca00: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ca10: 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f  E_NOMEM       */
ca20: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
ca30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ca40: 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22  READONLY    */ "
ca50: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
ca60: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
ca70: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
ca80: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20  LITE_INTERRUPT  
ca90: 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64   */ "interrupted
caa0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cab0: 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20  _IOERR       */ 
cac0: 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22  "disk I/O error"
cad0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cae0: 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22  CORRUPT     */ "
caf0: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
cb00: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
cb10: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cb20: 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20  _NOTFOUND    */ 
cb30: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "unknown operati
cb40: 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  on",.    /* SQLI
cb50: 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a  TE_FULL        *
cb60: 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  / "database or d
cb70: 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20  isk is full",.  
cb80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54    /* SQLITE_CANT
cb90: 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62  OPEN    */ "unab
cba0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
cbb0: 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f  ase file",.    /
cbc0: 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  * SQLITE_PROTOCO
cbd0: 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67  L    */ "locking
cbe0: 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20   protocol",.    
cbf0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  /* SQLITE_EMPTY 
cc00: 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
cc10: 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  /* SQLITE_SCHEMA
cc20: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
cc30: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
cc40: 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  anged",.    /* S
cc50: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20  QLITE_TOOBIG    
cc60: 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20    */ "string or 
cc70: 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20  blob too big",. 
cc80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     /* SQLITE_CON
cc90: 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e  STRAINT  */ "con
cca0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
ccb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
ccc0: 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64  ISMATCH    */ "d
ccd0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
cce0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
ccf0: 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20  _MISUSE      */ 
cd00: 22 62 61 64 20 70 61 72 61 6d 65 74 65 72 20 6f  "bad parameter o
cd10: 72 20 6f 74 68 65 72 20 41 50 49 20 6d 69 73 75  r other API misu
cd20: 73 65 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  se",.#ifdef SQLI
cd30: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 20  TE_DISABLE_LFS. 
cd40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
cd50: 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72  FS       */ "lar
cd60: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
cd70: 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 23 65  is disabled",.#e
cd80: 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  lse.    /* SQLIT
cd90: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
cda0: 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0,.#endif.    /
cdb0: 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20  * SQLITE_AUTH   
cdc0: 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69       */ "authori
cdd0: 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  zation denied",.
cde0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
cdf0: 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 30 2c 0a  RMAT      */ 0,.
ce00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41      /* SQLITE_RA
ce10: 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 63 6f  NGE       */ "co
ce20: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
ce30: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
ce40: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
ce50: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
ce60: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
ce70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
ce80: 4f 54 49 43 45 20 20 20 20 20 20 2a 2f 20 22 6e  OTICE      */ "n
ce90: 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d 65 73 73  otification mess
cea0: 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  age",.    /* SQL
ceb0: 49 54 45 5f 57 41 52 4e 49 4e 47 20 20 20 20 20  ITE_WARNING     
cec0: 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d 65 73 73  */ "warning mess
ced0: 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e  age",.  };.  con
cee0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
cef0: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
cf00: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
cf10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cf20: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a  _ABORT_ROLLBACK:
cf30: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
cf40: 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f  "abort due to RO
cf50: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62  LLBACK";.      b
cf60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cf70: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a  case SQLITE_ROW:
cf80: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
cf90: 22 61 6e 6f 74 68 65 72 20 72 6f 77 20 61 76 61  "another row ava
cfa0: 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 62  ilable";.      b
cfb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cfc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
cfd0: 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  : {.      zErr =
cfe0: 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20 61   "no more rows a
cff0: 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20  vailable";.     
d000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d010: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
d020: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
d030: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
d040: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
d050: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
d060: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
d070: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
d080: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
d090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d0a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d0b0: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
d0c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
d0d0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
d0e0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
d0f0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
d100: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
d110: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
d120: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
d130: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
d140: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
d150: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
d160: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
d170: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
d180: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ument..**.** Ret
d190: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  urn non-zero to 
d1a0: 72 65 74 72 79 20 74 68 65 20 6c 6f 63 6b 2e 20  retry the lock. 
d1b0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 74 6f 20   Return zero to 
d1c0: 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a 2a 20 61  stop trying.** a
d1d0: 6e 64 20 63 61 75 73 65 20 53 51 4c 69 74 65 20  nd cause SQLite 
d1e0: 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
d1f0: 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  _BUSY..*/.static
d200: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
d210: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
d220: 20 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20    void *ptr,    
d230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
d240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d250: 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  n */.  int count
d260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
d280: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
d290: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73 71 6c 69  n busy */.  sqli
d2a0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
d2b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
d2c0: 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f   on which the lo
d2d0: 63 6b 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  ck occurred */.)
d2e0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
d2f0: 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45  WIN || HAVE_USLE
d300: 45 50 0a 20 20 2f 2a 20 54 68 69 73 20 63 61 73  EP.  /* This cas
d310: 65 20 69 73 20 66 6f 72 20 73 79 73 74 65 6d 73  e is for systems
d320: 20 74 68 61 74 20 68 61 76 65 20 73 75 70 70 6f   that have suppo
d330: 72 74 20 66 6f 72 20 73 6c 65 65 70 69 6e 67 20  rt for sleeping 
d340: 66 6f 72 20 66 72 61 63 74 69 6f 6e 73 20 6f 66  for fractions of
d350: 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 2e 20  .  ** a second. 
d360: 20 45 78 61 6d 70 6c 65 73 3a 20 20 41 6c 6c 20   Examples:  All 
d370: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2c  windows systems,
d380: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20 77 69   unix systems wi
d390: 74 68 20 75 73 6c 65 65 70 28 29 20 2a 2f 0a 20  th usleep() */. 
d3a0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
d3b0: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
d3c0: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
d3d0: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
d3e0: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
d3f0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
d400: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
d410: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
d420: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
d430: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
d440: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
d450: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
d460: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
d470: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
d480: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
d490: 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 64 62 2d   int tmout = db-
d4a0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
d4b0: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
d4c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
d4d0: 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49  _ENABLE_SETLK_TI
d4e0: 4d 45 4f 55 54 0a 20 20 69 66 28 20 73 71 6c 69  MEOUT.  if( sqli
d4f0: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
d500: 28 70 46 69 6c 65 2c 53 51 4c 49 54 45 5f 46 43  (pFile,SQLITE_FC
d510: 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  NTL_LOCK_TIMEOUT
d520: 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c 49 54 45  ,&tmout)==SQLITE
d530: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 63  _OK ){.    if( c
d540: 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 74 6d  ount ){.      tm
d550: 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  out = 0;.      s
d560: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
d570: 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  rol(pFile, SQLIT
d580: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d590: 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29 3b 0a 20  EOUT, &tmout);. 
d5a0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d5b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d5d0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
d5e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46 69  ED_PARAMETER(pFi
d5f0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  le);.#endif.  as
d600: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
d610: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
d620: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
d630: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
d640: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
d650: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
d660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
d670: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
d680: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
d690: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
d6a0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
d6b0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
d6c0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
d6d0: 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f 75 74 20  + delay > tmout 
d6e0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
d6f0: 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20  mout - prior;.  
d700: 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29    if( delay<=0 )
d710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d720: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
d730: 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a  db->pVfs, delay*
d740: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
d750: 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54 68  1;.#else.  /* Th
d760: 69 73 20 63 61 73 65 20 66 6f 72 20 75 6e 69 78  is case for unix
d770: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 6c 61   systems that la
d780: 63 6b 20 75 73 6c 65 65 70 28 29 20 73 75 70 70  ck usleep() supp
d790: 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e 67 0a 20  ort.  Sleeping. 
d7a0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 64 6f 6e 65   ** must be done
d7b0: 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f   in increments o
d7c0: 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e 64 73 20  f whole seconds 
d7d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d7e0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d7f0: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d800: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
d810: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
d820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d830: 45 52 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ER(pFile);.  if(
d840: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
d850: 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20 72  > tmout ){.    r
d860: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d870: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
d880: 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29  ->pVfs, 1000000)
d890: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
d8a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ndif.}../*.** In
d8b0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62  voke the given b
d8c0: 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a  usy handler..**.
d8d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d8e0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
d8f0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  n operation fail
d900: 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 0a  ed to acquire a.
d910: 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46 53 20 66  ** lock on VFS f
d920: 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ile pFile..**.**
d930: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
d940: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
d950: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
d960: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
d970: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
d980: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
d990: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
d9a0: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
d9b0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
d9c0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
d9d0: 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20 73 71 6c  yHandler *p, sql
d9e0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
d9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
da00: 66 28 20 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c  f( p->xBusyHandl
da10: 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  er==0 || p->nBus
da20: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
da30: 20 20 69 66 28 20 70 2d 3e 62 45 78 74 72 61 46    if( p->bExtraF
da40: 69 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 2f 2a  ileArg ){.    /*
da50: 20 41 64 64 20 61 6e 20 65 78 74 72 61 20 70 61   Add an extra pa
da60: 72 61 6d 65 74 65 72 20 77 69 74 68 20 74 68 65  rameter with the
da70: 20 70 46 69 6c 65 20 70 6f 69 6e 74 65 72 20 74   pFile pointer t
da80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
da90: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  .    ** callback
daa0: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a   argument list *
dab0: 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78 54 72 61  /.    int (*xTra
dac0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69  )(void*,int,sqli
dad0: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20 20 20 20  te3_file*);.    
dae0: 78 54 72 61 20 3d 20 28 69 6e 74 28 2a 29 28 76  xTra = (int(*)(v
daf0: 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  oid*,int,sqlite3
db00: 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42 75 73 79  _file*))p->xBusy
db10: 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 72 63 20  Handler;.    rc 
db20: 3d 20 78 54 72 61 28 70 2d 3e 70 42 75 73 79 41  = xTra(p->pBusyA
db30: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c 20 70 46  rg, p->nBusy, pF
db40: 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ile);.  }else{. 
db50: 20 20 20 2f 2a 20 4c 65 67 61 63 79 20 73 74 79     /* Legacy sty
db60: 6c 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  le busy handler 
db70: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20  callback */.    
db80: 72 63 20 3d 20 70 2d 3e 78 42 75 73 79 48 61 6e  rc = p->xBusyHan
db90: 64 6c 65 72 28 70 2d 3e 70 42 75 73 79 41 72 67  dler(p->pBusyArg
dba0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 7d  , p->nBusy);.  }
dbb0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
dbc0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d      p->nBusy = -
dbd0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
dbe0: 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a  p->nBusy++;.  }.
dbf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
dc00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
dc10: 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73  ine sets the bus
dc20: 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  y callback for a
dc30: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
dc40: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
dc50: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
dc60: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
dc70: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  en argument..*/.
dc80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
dc90: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
dca0: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28  te3 *db,.  int (
dcb0: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
dcc0: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
dcd0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
dce0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
dcf0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
dd00: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
dd10: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
dd20: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
dd30: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
dd40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
dd50: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
dd60: 75 73 79 48 61 6e 64 6c 65 72 2e 78 42 75 73 79  usyHandler.xBusy
dd70: 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 3b  Handler = xBusy;
dd80: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
dd90: 65 72 2e 70 42 75 73 79 41 72 67 20 3d 20 70 41  er.pBusyArg = pA
dda0: 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  rg;.  db->busyHa
ddb0: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
ddc0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
ddd0: 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67  er.bExtraFileArg
dde0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
ddf0: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73  Timeout = 0;.  s
de00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
de10: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de30: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
de40: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
de50: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
de60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
de70: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
de80: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
de90: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
dea0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
deb0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
dec0: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
ded0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
dee0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
def0: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
df00: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
df10: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
df20: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
df30: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
df40: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
df50: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
df60: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
df70: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
df80: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
df90: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
dfa0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
dfb0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
dfc0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
dfd0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
dfe0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
dff0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e000: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e010: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
e020: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
e030: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
e040: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
e050: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
e060: 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73  = (unsigned)nOps
e070: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
e080: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
e090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
e0a0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
e0b0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
e0c0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
e0d0: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
e0e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
e0f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e100: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
e110: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
e120: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
e130: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
e140: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
e150: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
e160: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
e170: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
e180: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
e190: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e1a0: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
e1b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
e1c0: 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s){.#ifdef SQLIT
e1d0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e1e0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e1f0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e200: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
e210: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e220: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e  #endif.  if( ms>
e230: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e240: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
e250: 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c  , (int(*)(void*,
e260: 69 6e 74 29 29 73 71 6c 69 74 65 44 65 66 61 75  int))sqliteDefau
e270: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 0a  ltBusyCallback,.
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
e2a0: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
e2b0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
e2c0: 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  s;.    db->busyH
e2d0: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
e2e0: 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  eArg = 1;.  }els
e2f0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
e300: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
e310: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
e320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e330: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
e340: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
e350: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
e360: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
e370: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
e380: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
e390: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
e3a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e3b0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e3c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e3d0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e3e0: 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  && (db==0 || db-
e3f0: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
e400: 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a  AGIC_ZOMBIE) ){.
e410: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e420: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e430: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
e440: 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73  ndif.  db->u1.is
e450: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
e460: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
e470: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
e480: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
e490: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e4a0: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
e4b0: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
e4c0: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
e4d0: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
e4e0: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
e4f0: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
e500: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
e510: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
e520: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e530: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
e540: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
e550: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
e560: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
e570: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
e580: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
e590: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e5b0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
e5c0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
e5d0: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
e5e0: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  ata,.  void (*xS
e5f0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e600: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e610: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e620: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e630: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e640: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e650: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e660: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e670: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e680: 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74   (*xValue)(sqlit
e690: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e6a0: 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29  void (*xInverse)
e6b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e6c0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e6d0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75 6e 63 44  lue **),.  FuncD
e6e0: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
e6f0: 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63  ructor.){.  Func
e700: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
e710: 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61  ame;.  int extra
e720: 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74  Flags;..  assert
e730: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e740: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78 56 61  );.  assert( xVa
e760: 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46 75 6e 63  lue==0 || xSFunc
e770: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ==0 );.  if( zFu
e780: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 20 20  nctionName==0   
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7a0: 4d 75 73 74 20 68 61 76 65 20 61 20 76 61 6c 69  Must have a vali
e7b0: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c 7c 20  d name */.   || 
e7c0: 28 78 53 46 75 6e 63 21 3d 30 20 26 26 20 78 46  (xSFunc!=0 && xF
e7d0: 69 6e 61 6c 21 3d 30 29 20 20 20 20 20 20 20 20  inal!=0)        
e7e0: 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78 53 46 75  /* Not both xSFu
e7f0: 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c 20 2a 2f  nc and xFinal */
e800: 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e 61 6c 3d  .   || ((xFinal=
e810: 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d 30 29 29  =0)!=(xStep==0))
e820: 20 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f         /* Both o
e830: 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78 46 69  r neither of xFi
e840: 6e 61 6c 20 61 6e 64 20 78 53 74 65 70 20 2a 2f  nal and xStep */
e850: 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c 75 65 3d  .   || ((xValue=
e860: 3d 30 29 21 3d 28 78 49 6e 76 65 72 73 65 3d 3d  =0)!=(xInverse==
e870: 30 29 29 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f  0))    /* Both o
e880: 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78 56 61  r neither of xVa
e890: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f  lue, xInverse */
e8a0: 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c 2d 31 20  .   || (nArg<-1 
e8b0: 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d  || nArg>SQLITE_M
e8c0: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29  AX_FUNCTION_ARG)
e8d0: 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28 6e 4e 61  .   || (255<(nNa
e8e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
e8f0: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
e900: 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  ame))).  ){.    
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e920: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
e930: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
e940: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
e950: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
e960: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
e970: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
e980: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
e990: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
e9a0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
e9b0: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
e9c0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
e9d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
e9e0: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
e9f0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
ea00: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
ea10: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
ea20: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
ea30: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
ea40: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
ea50: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
ea60: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
ea70: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
ea80: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
ea90: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
eaa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
eab0: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
eac0: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
ead0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
eae0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
eaf0: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
eb00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
eb10: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
eb20: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
eb30: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
eb40: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
eb50: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
eb60: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
eb70: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
eb80: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
eb90: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
eba0: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
ebb0: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
ebc0: 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e  pUserData, xSFun
ebd0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
ebe0: 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  , xValue, xInver
ebf0: 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  se, pDestructor)
ec00: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
ec10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ec20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
ec30: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
ec40: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
ec50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c   SQLITE_UTF16LE|
ec60: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
ec70: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
ec80: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
ec90: 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20  xFinal, xValue, 
eca0: 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72  xInverse, pDestr
ecb0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
ecc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ecd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
ece0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
ecf0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
ed00: 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73  TF16BE;.  }.#els
ed10: 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45  e.  enc = SQLITE
ed20: 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20  _UTF8;.#endif.  
ed30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
ed40: 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74  n existing funct
ed50: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65  ion is being ove
ed60: 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74  rridden or delet
ed70: 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  ed. If so,.  ** 
ed80: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
ed90: 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72  tive VMs, then r
eda0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
edb0: 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e  Y. If a function
edc0: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f  .  ** is being o
edd0: 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65  verridden/delete
ede0: 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20  d but there are 
edf0: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61  no active VMs, a
ee00: 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70  llow the.  ** op
ee10: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  eration to conti
ee20: 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61  nue but invalida
ee30: 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c  te all precompil
ee40: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
ee50: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
ee60: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
ee70: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
ee80: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
ee90: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28  0);.  if( p && (
eea0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
eeb0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
eec0: 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20 26 26  SK)==(u32)enc &&
eed0: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29   p->nArg==nArg )
eee0: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
eef0: 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
ef00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
ef10: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
ef20: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
ef30: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
ef40: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
ef50: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
ef60: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
ef70: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
ef80: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
ef90: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
efa0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
efb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
efc0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
efd0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
efe0: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  s(db, 0);.    }.
eff0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
f000: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
f010: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
f020: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
f030: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
f040: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
f050: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
f060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f070: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
f080: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
f090: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
f0a0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
f0b0: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
f0c0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
f0d0: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
f0e0: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
f0f0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
f100: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
f110: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
f120: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
f130: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
f140: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
f150: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44  +;.  }.  p->u.pD
f160: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
f170: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75  tructor;.  p->fu
f180: 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75  ncFlags = (p->fu
f190: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
f1a0: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c  _FUNC_ENCMASK) |
f1b0: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74   extraFlags;.  t
f1c0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63  estcase( p->func
f1d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  Flags & SQLITE_D
f1e0: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
f1f0: 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53    p->xSFunc = xS
f200: 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20  Func ? xSFunc : 
f210: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
f220: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
f230: 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20 78 56    p->xValue = xV
f240: 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e 76 65  alue;.  p->xInve
f250: 72 73 65 20 3d 20 78 49 6e 76 65 72 73 65 3b 0a  rse = xInverse;.
f260: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
f270: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
f280: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
f290: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
f2a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f2b0: 57 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20  Worker function 
f2c0: 75 73 65 64 20 62 79 20 75 74 66 2d 38 20 41 50  used by utf-8 AP
f2d0: 49 73 20 74 68 61 74 20 63 72 65 61 74 65 20 6e  Is that create n
f2e0: 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ew functions:.**
f2f0: 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .**    sqlite3_c
f300: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
f310: 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .**    sqlite3_c
f320: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
f330: 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  2().**    sqlite
f340: 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f  3_create_window_
f350: 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a 73 74  function().*/.st
f360: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 46  atic int createF
f370: 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20 73 71  unctionApi(.  sq
f380: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
f390: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
f3a0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
f3b0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
f3c0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
f3d0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
f3e0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
f3f0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
f400: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
f410: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f420: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
f430: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
f440: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f450: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56  t*),.  void (*xV
f460: 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  alue)(sqlite3_co
f470: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
f480: 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69  (*xInverse)(sqli
f490: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
f4a0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
f4b0: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 74  ),.  void(*xDest
f4c0: 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  roy)(void*).){. 
f4d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f4e0: 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65  _ERROR;.  FuncDe
f4f0: 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d  structor *pArg =
f500: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
f510: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f520: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f530: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f540: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f550: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
f560: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
f570: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f580: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f590: 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f  );.  if( xDestro
f5a0: 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20  y ){.    pArg = 
f5b0: 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20  (FuncDestructor 
f5c0: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
f5d0: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
f5e0: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
f5f0: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
f600: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
f610: 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73 74  db);.      xDest
f620: 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f  roy(p);.      go
f630: 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  to out;.    }.  
f640: 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20 30    pArg->nRef = 0
f650: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  ;.    pArg->xDes
f660: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
f670: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
f680: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
f690: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
f6a0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
f6b0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
f6c0: 0a 20 20 20 20 20 20 78 53 46 75 6e 63 2c 20 78  .      xSFunc, x
f6d0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56  Step, xFinal, xV
f6e0: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20  alue, xInverse, 
f6f0: 70 41 72 67 0a 20 20 29 3b 0a 20 20 69 66 28 20  pArg.  );.  if( 
f700: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52  pArg && pArg->nR
f710: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ef==0 ){.    ass
f720: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f730: 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72  OK );.    xDestr
f740: 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  oy(p);.    sqlit
f750: 65 33 5f 66 72 65 65 28 70 41 72 67 29 3b 0a 20  e3_free(pArg);. 
f760: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
f770: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
f780: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
f790: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f7a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f7b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f7c0: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
f7d0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
f7e0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
f7f0: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
f800: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
f810: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
f820: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
f830: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
f840: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
f850: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
f860: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
f870: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
f880: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
f890: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f8a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f8b0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
f8c0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
f8d0: 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  ext*).){.  retur
f8e0: 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  n createFunction
f8f0: 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  Api(db, zFunc, n
f900: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46  Arg, enc, p, xSF
f910: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 30 29  xFinal, 0, 0, 0)
f950: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
f960: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
f970: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
f980: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
f990: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
f9a0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
f9b0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
f9c0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
f9d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f9f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
fa00: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
fa10: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
fa20: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
fa30: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
fa40: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
fa50: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
fa60: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 72  )(void *).){.  r
fa70: 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63  eturn createFunc
fa80: 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e  tionApi(db, zFun
fa90: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
faa0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30      xFinal, 0, 0
fae0: 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 69  , xDestroy);.}.i
faf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
fb00: 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f  e_window_functio
fb10: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
fb20: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
fb30: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
fb40: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
fb50: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
fb60: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
fb70: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
fb80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
fb90: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
fba0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
fbb0: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56  t*),.  void (*xV
fbc0: 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  alue)(sqlite3_co
fbd0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
fbe0: 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69  (*xInverse)(sqli
fbf0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fc00: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fc10: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
fc20: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
fc30: 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74  {.  return creat
fc40: 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c  eFunctionApi(db,
fc50: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
fc60: 63 2c 20 70 2c 20 30 2c 20 78 53 74 65 70 2c 0a  c, p, 0, xStep,.
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c      xFinal, xVal
fca0: 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 78 44  ue, xInverse, xD
fcb0: 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69 66 6e  estroy);.}..#ifn
fcc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fcd0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
fce0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
fcf0: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
fd00: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
fd10: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
fd20: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
fd30: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
fd40: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
fd50: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
fd60: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
fd70: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
fd80: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
fd90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fda0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
fdb0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
fdc0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
fdd0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
fde0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
fdf0: 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53  Func8;..#ifdef S
fe00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fe10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fe20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fe30: 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74  Ok(db) || zFunct
fe40: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ionName==0 ) ret
fe50: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
fe60: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
fe70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fe80: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fe90: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
fea0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
feb0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
fec0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
fed0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
fee0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
fef0: 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  TIVE);.  rc = sq
ff00: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ff10: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
ff20: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
ff30: 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e  SFunc,xStep,xFin
ff40: 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73 71 6c  al,0,0,0);.  sql
ff50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
ff60: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
ff70: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
ff80: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
ff90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ffa0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
ffb0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
ffc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ffd0: 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70 6c  wing is the impl
ffe0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e  ementation of an
fff0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
10000 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61 69  at always.** fai
10010 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ls with an error
10020 20 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e 67   message stating
10030 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
10040 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  on is used in th
10050 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74 65  e.** wrong conte
10060 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  xt.  The sqlite3
10070 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
10080 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20 63  on() API might c
10090 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c 20  onstruct.** SQL 
100a0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
100b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
100c0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
100d0 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74 0a  ions will exist.
100e0 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  ** for name reso
100f0 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20 61  lution but are a
10100 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61 64  ctually overload
10110 65 64 20 62 79 20 74 68 65 20 78 46 69 6e 64 46  ed by the xFindF
10120 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68 6f  unction.** metho
10130 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  d of virtual tab
10140 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
10150 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  oid sqlite3Inval
10160 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
10170 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
10180 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65 20  ontext,  /* The 
10190 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e 67  function calling
101a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
101b0 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  t NotUsed,      
101c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
101d0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
101e0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
101f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
10200 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20 20  ue **NotUsed2   
10210 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68  /* Value of each
10220 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
10230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10240 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
10250 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  r*)sqlite3_user_
10260 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
10270 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
10280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
10290 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
102a0 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  d2);.  zErr = sq
102b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
102c0 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
102d0 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73 20  use function %s 
102e0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
102f0 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d 65   context", zName
10300 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
10310 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
10320 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  t, zErr, -1);.  
10330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
10340 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  r);.}../*.** Dec
10350 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
10360 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
10370 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
10380 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
10390 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
103a0 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
103b0 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
103c0 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
103d0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
103e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
103f0 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
10400 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
10410 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
10420 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
10430 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
10440 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
10450 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
10460 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
10470 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
10480 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
10490 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
104a0 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
104b0 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
104c0 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
104d0 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
104e0 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
104f0 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
10500 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
10510 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
10520 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
10530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10540 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
10550 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
10560 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
10570 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
10580 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  rg.){.  int rc;.
10590 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 0a    char *zCopy;..
105a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
105b0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
105c0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
105d0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
105e0 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41  | zName==0 || nA
105f0 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74  rg<-2 ){.    ret
10600 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10610 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
10620 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
10630 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10640 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ex);.  rc = sqli
10650 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
10660 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
10670 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
10680 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  !=0;.  sqlite3_m
10690 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
106a0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63 20  utex);.  if( rc 
106b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
106c0 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 71  OK;.  zCopy = sq
106d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 4e  lite3_mprintf(zN
106e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 70  ame);.  if( zCop
106f0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
10700 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 65  LITE_NOMEM;.  re
10710 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
10720 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
10730 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
10740 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c 20           zCopy, 
10770 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
10780 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73 71  nction, 0, 0, sq
10790 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a  lite3_free);.}..
107a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
107b0 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
107c0 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
107d0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
107e0 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
107f0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
10800 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
10810 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
10820 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
10830 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
10840 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
10850 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
10860 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
10870 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
10880 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
10890 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
108a0 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
108b0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
108c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
108d0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
108e0 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  TED.void *sqlite
108f0 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
10900 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63  *db, void(*xTrac
10910 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
10920 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
10930 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
10940 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10950 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10960 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10970 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10980 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
10990 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
109a0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
109b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
109c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
109d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
109e0 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
109f0 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61  eArg;.  db->mTra
10a00 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51  ce = xTrace ? SQ
10a10 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43  LITE_TRACE_LEGAC
10a20 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72  Y : 0;.  db->xTr
10a30 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33  ace = (int(*)(u3
10a40 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  2,void*,void*,vo
10a50 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64  id*))xTrace;.  d
10a60 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
10a70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10a80 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10a90 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10aa0 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
10ab0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
10ac0 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20  PRECATED */../* 
10ad0 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
10ae0 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
10af0 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e  the version-2 in
10b00 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
10b10 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
10b20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b50 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e  * Trace this con
10b60 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73  nection */.  uns
10b70 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20  igned mTrace,   
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10ba0 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20  of events to be 
10bb0 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28  traced */.  int(
10bc0 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65  *xTrace)(unsigne
10bd0 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  d,void*,void*,vo
10be0 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61  id*),  /* Callba
10bf0 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a  ck to invoke */.
10c00 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c30 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69  Context */.){.#i
10c40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10c50 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10c60 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10c70 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10c80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10c90 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10ca0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
10cb0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10cc0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
10cd0 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54  ( mTrace==0 ) xT
10ce0 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  race = 0;.  if( 
10cf0 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61  xTrace==0 ) mTra
10d00 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54  ce = 0;.  db->mT
10d10 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20  race = mTrace;. 
10d20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
10d30 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
10d40 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
10d50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10d60 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10d80 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
10d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
10da0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69  CATED./*.** Regi
10db0 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
10dc0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
10dd0 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
10de0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
10df0 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
10e00 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
10e10 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
10e20 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
10e30 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
10e40 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
10e50 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
10e60 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
10e70 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
10e80 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
10e90 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
10ea0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
10eb0 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
10ec0 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
10ed0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
10ee0 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
10ef0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
10f00 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
10f10 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
10f20 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
10f30 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
10f40 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
10f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10f60 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10f70 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10f80 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10f90 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
10fa0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10fb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10fc0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
10fd0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10fe0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
10ff0 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
11000 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
11010 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
11020 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
11030 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11040 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11050 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11060 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
11070 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11080 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
11090 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
110a0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
110b0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
110c0 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
110d0 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
110e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
110f0 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
11100 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
11110 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
11120 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
11130 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
11140 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
11150 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
11160 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
11170 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11180 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
11190 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
111a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
111b0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
111c0 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
111d0 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
111e0 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
111f0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
11200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
11210 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
11220 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
11230 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
11240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11250 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
11260 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11270 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
11280 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
11290 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
112a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
112b0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
112c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
112d0 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
112e0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
112f0 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
11300 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
11310 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
11320 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
11330 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11340 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
11350 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
11360 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
11370 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
11380 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
11390 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
113a0 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
113b0 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
113c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
113d0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
113e0 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
113f0 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
11400 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11410 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
11420 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
11430 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
11440 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
11450 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
11460 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
11470 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
11480 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114a0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
114b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
114c0 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
114d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
114e0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
114f0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11500 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
11510 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
11520 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11530 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11540 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11550 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11560 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
11570 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
11580 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
11590 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
115a0 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
115b0 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
115c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
115d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
115e0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
115f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
11600 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
11610 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
11620 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
11630 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
11640 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
11650 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11660 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
11670 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
11680 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116a0 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
116b0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
116c0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
116d0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
116e0 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
116f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
11700 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11710 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
11720 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
11730 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
11740 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
11750 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
11760 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
11770 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11780 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
11790 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
117a0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
117b0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
117c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
117d0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
117e0 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
117f0 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
11800 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
11810 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
11820 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
11830 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
11840 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11850 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11860 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
11870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11880 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
11890 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  OOK./*.** Regist
118a0 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
118b0 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
118c0 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
118d0 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
118e0 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
118f0 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
11900 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11910 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
11920 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  preupdate_hook(.
11930 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11950 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
11960 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
11970 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  */.  void(*xCall
11980 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f  back)(         /
11990 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
119a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a  ion */.    void*
119b0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68  ,sqlite3*,int,ch
119c0 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63  ar const*,char c
119d0 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  onst*,sqlite3_in
119e0 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  t64,sqlite3_int6
119f0 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63  /* First callbac
11a20 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  k argument */.){
11a30 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
11a40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11a50 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11a60 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50  .  pRet = db->pP
11a70 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  reUpdateArg;.  d
11a80 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
11a90 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
11aa0 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  k;.  db->pPreUpd
11ab0 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
11ac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11ad0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11ae0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
11af0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11b00 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
11b10 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
11b20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b30 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
11b40 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11b50 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
11b60 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
11b70 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
11b80 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
11b90 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11ba0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
11bb0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
11bc0 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
11bd0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
11be0 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
11bf0 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
11c00 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
11c10 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
11c20 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
11c30 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
11c40 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
11c50 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
11c60 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
11c70 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
11c80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11c90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
11ca0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
11cb0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
11cc0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
11cd0 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
11ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11cf0 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
11d00 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
11d10 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
11d20 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
11d30 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11d40 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11d50 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
11d60 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
11d70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
11d80 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
11d90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
11db0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11dc0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
11dd0 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
11de0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
11df0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
11e00 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
11e10 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
11e20 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
11e30 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11e40 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
11e50 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
11e60 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
11e70 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
11e80 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
11e90 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
11ea0 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
11eb0 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
11ec0 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
11ed0 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
11ee0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
11ef0 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
11f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11f10 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
11f20 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
11f30 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
11f40 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
11f50 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
11f60 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
11f70 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
11f80 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11f90 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
11fa0 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
11fb0 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
11fc0 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
11fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
11fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
11ff0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
12000 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12010 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
12020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
12030 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12040 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
12050 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
12060 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
12070 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12080 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
12090 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
120a0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
120b0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
120c0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
120d0 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
120e0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
120f0 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
12100 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
12110 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
12120 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
12130 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12140 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
12150 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
12160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12170 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
12180 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
12190 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
121a0 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
121b0 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
121c0 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
121d0 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
121e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
121f0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
12200 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
12210 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
12220 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12230 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
12240 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
12250 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
12260 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
12270 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
12280 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
12290 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
122a0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
122b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
122c0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
122d0 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
122e0 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
122f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
12300 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
12310 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12320 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
12330 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
12340 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
12350 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
12360 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
12370 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
12380 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
12390 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
123a0 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
123b0 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
123c0 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
123d0 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
123e0 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
123f0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
12400 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12410 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
12420 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
12430 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
12440 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
12450 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
12460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
12470 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
12480 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
124b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
124c0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
124e0 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
124f0 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
12500 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
12510 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12520 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
12530 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
12540 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
12550 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
12560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
12570 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
12580 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
12590 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
125c0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
125d0 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
125e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
125f0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
12600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
12610 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
12640 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
12650 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
12660 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
12670 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
12680 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
12690 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
126a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
126b0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
126c0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
126d0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
126e0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
126f0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
12700 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12710 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
12720 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
12730 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
12740 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
12750 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
12760 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
12770 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
12780 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
12790 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
127a0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
127b0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
127c0 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
127d0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
127e0 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
127f0 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
12800 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12810 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
12820 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
12830 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12840 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
12850 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
12860 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
12870 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
12880 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
12890 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
128a0 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
128b0 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
128c0 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
128d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
128e0 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
128f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12900 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12910 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
12920 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
12930 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
12940 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
12950 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
12960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
12970 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
12980 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12990 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
129a0 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
129b0 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
129c0 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
129d0 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
129e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
129f0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
12a00 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
12a10 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
12a20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12a30 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
12a50 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  xit(db, rc);..  
12a60 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12a70 6e 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  no active statem
12a80 65 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ents, clear the 
12a90 69 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20 61  interrupt flag a
12aa0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
12ab0 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  t.  */.  if( db-
12ac0 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20  >nVdbeActive==0 
12ad0 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73  ){.    db->u1.is
12ae0 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b  Interrupted = 0;
12af0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
12b00 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12b10 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12b20 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
12b30 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
12b40 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
12b50 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
12b60 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
12b70 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
12b80 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
12b90 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
12ba0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
12bb0 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
12bc0 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
12bd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
12be0 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
12bf0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
12c00 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45  ar *zDb){.  /* E
12c10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
12c20 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71  613-20553 The sq
12c30 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12c40 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75  oint(D,X) is equ
12c50 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  ivalent to.  ** 
12c60 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12c70 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51  kpoint_v2(D,X,SQ
12c80 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
12c90 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f  PASSIVE,0,0). */
12ca0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12cb0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12cc0 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54  _v2(db,zDb,SQLIT
12cd0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
12ce0 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69  SIVE,0,0);.}..#i
12cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12d00 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
12d10 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
12d20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
12d30 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12d40 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
12d50 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
12d60 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
12d70 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
12d80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
12d90 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
12da0 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
12db0 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
12dc0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
12dd0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
12de0 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
12df0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
12e00 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12e10 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
12e20 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
12e30 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
12e40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
12e50 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
12e60 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
12e70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
12e80 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
12e90 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
12ea0 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
12eb0 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
12ec0 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
12ed0 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
12ee0 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
12ef0 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
12f00 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
12f10 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
12f20 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
12f30 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
12f40 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
12f50 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
12f60 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
12f70 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
12f80 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
12f90 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
12fa0 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
12fb0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
12fc0 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
12fd0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
12fe0 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
12ff0 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
13000 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
13010 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
13020 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
13030 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
13040 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
13050 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20  _PASSIVE, FULL, 
13060 52 45 53 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52  RESTART.** or TR
13070 55 4e 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73  UNCATE..*/.int s
13080 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
13090 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
130a0 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
130b0 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
130c0 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
130d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
130e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
130f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13100 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
13130 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
13140 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
13150 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13170 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
13180 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
13190 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
131a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
131b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
131c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
131d0 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
131e0 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
131f0 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
13200 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
13210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
13220 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
13230 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
13240 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
13250 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
13260 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
13270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13280 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
13290 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
132a0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
132b0 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
132c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
132d0 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
132e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
132f0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
13300 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
13310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
13340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
13350 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
13360 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
13370 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13380 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
13390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
133a0 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
133b0 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
133c0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
133d0 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
133e0 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
133f0 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
13400 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
13410 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
13420 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
13430 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
13440 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
13450 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
13460 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
13470 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
13480 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
13490 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
134a0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
134b0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
134c0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
134d0 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
134e0 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
134f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
13500 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
13510 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
13520 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
13530 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
13540 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
13550 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
13560 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13570 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
13580 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
13590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
135d0 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
135e0 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
135f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
13600 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
13610 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
13620 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
13630 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
13640 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
13660 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
13670 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
136b0 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
136e0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
136f0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13720 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13730 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
13740 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13750 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13760 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
13770 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
13780 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
13790 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
137b0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
137c0 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
137d0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
137e0 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
137f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13800 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
13810 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
13820 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
13830 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13840 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
13850 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
13860 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
13870 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13880 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53  _STORE==3.  UNUS
13890 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
138a0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
138b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
138c0 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
138d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
138e0 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E>3.  UNUSED_PAR
138f0 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
13900 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
13910 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
13920 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
13930 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
13940 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
13950 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
13960 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
13970 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
13980 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
13990 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
139a0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
139b0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
139c0 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
139d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
139e0 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
139f0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
13a00 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
13a10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
13a20 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
13a30 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
13a40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13a50 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13a60 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13a70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
13a80 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13aa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13ab0 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
13ac0 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
13ad0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
13ae0 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
13af0 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
13b00 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
13b10 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
13b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
13b30 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
13b40 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
13b50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13b60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13b70 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
13b80 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
13b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13ba0 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
13bb0 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
13bc0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
13bd0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
13be0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
13bf0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
13c00 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
13c10 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
13c20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
13c30 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
13c40 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
13c50 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
13c60 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
13c70 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
13c80 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
13c90 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
13ca0 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
13cb0 3d 20 7b 0a 20 20 20 20 27 62 27 2c 20 27 61 27  = {.    'b', 'a'
13cc0 2c 20 27 64 27 2c 20 27 20 27 2c 20 27 70 27 2c  , 'd', ' ', 'p',
13cd0 20 27 61 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'a', 'r', 'a', 
13ce0 27 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c 20 27  'm', 'e', 't', '
13cf0 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20 20  e', 'r', ' ',.  
13d00 20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c    'o', 'r', ' ',
13d10 20 27 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c 20   'o', 't', 'h', 
13d20 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27  'e', 'r', ' ', '
13d30 41 27 2c 20 27 50 27 2c 20 27 49 27 2c 20 27 20  A', 'P', 'I', ' 
13d40 27 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69 27 2c  ',.    'm', 'i',
13d50 20 27 73 27 2c 20 27 75 27 2c 20 27 73 27 2c 20   's', 'u', 's', 
13d60 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
13d70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
13d80 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
13d90 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
13da0 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
13db0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
13dc0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
13dd0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13de0 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
13df0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
13e00 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
13e10 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
13e20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13e30 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
13e40 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
13e50 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
13e60 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
13e70 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
13e80 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
13e90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
13ea0 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72  hMsg(db, db->err
13eb0 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Code, sqlite3Err
13ec0 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
13ed0 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
13ee0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13ef0 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
13f00 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
13f10 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
13f20 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
13f30 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
13f40 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
13f50 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
13f60 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
13f70 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
13f80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
13f90 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
13fa0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
13fb0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
13fc0 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
13fd0 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
13fe0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
13ff0 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
14000 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
14010 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
14020 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
14030 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
14040 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a  mClear(db);.  }.
14050 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14060 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
14070 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
14080 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14090 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
140a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
140b0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
140c0 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
140d0 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
140e0 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
140f0 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
14100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
14110 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
14120 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
14130 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
14140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14150 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
14160 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
14170 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
14180 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
14190 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
141a0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
141b0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
141c0 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
141d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
141e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
141f0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
14200 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
14210 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
14220 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  }.int sqlite3_ex
14230 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73  tended_errcode(s
14240 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
14250 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
14260 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
14270 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
14280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
14290 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
142a0 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
142b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
142c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
142d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
142e0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
142f0 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71  rrCode;.}.int sq
14300 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
14310 6e 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  no(sqlite3 *db){
14320 0a 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64  .  return db ? d
14330 62 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30  b->iSysErrno : 0
14340 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ;.}  ../*.** Ret
14350 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
14360 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
14370 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
14380 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
14390 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
143a0 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
143b0 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
143c0 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
143d0 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
143e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
143f0 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
14400 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
14410 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
14420 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc);.}../*.** Cr
14430 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
14440 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
14450 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
14460 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
14470 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
14480 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
14490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
144a0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
144b0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
144c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
144d0 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
144e0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
144f0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
14500 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
14510 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
14520 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
14530 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
14540 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
14550 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20   int enc2;.  .  
14560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14570 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
14580 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
14590 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
145a0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
145b0 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
145c0 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
145d0 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
145e0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
145f0 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
14600 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
14610 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
14620 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
14630 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
14640 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
14650 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
14660 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
14670 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
14680 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
14690 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
146a0 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
146b0 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
146c0 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
146d0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
146e0 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
146f0 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
14700 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
14710 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
14720 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
14730 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
14740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
14750 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
14760 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
14770 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
14780 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
14790 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
147a0 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
147b0 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
147c0 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
147d0 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
147e0 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
147f0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14800 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
14810 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
14820 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
14830 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
14840 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
14850 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
14860 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
14870 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
14880 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
14890 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
148a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
148b0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
148c0 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
148d0 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
148e0 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
148f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14900 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
14910 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
14920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14930 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
14940 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
14950 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
14960 73 28 64 62 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  s(db, 0);..    /
14970 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
14980 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
14990 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
149a0 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
149b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
149c0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
149d0 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
149e0 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
149f0 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
14a00 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
14a10 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
14a20 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
14a30 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
14a40 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
14a50 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
14a60 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
14a70 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
14a80 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
14a90 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
14aa0 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
14ab0 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
14ac0 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
14ad0 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
14ae0 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
14af0 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
14b00 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
14b10 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  e);.      int j;
14b20 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
14b30 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
14b40 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20     CollSeq *p = 
14b50 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  &aColl[j];.     
14b60 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70     if( p->enc==p
14b70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
14b80 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44         if( p->xD
14b90 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
14ba0 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73    p->xDel(p->pUs
14bb0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
14bc0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43  .          p->xC
14bd0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mp = 0;.        
14be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14bf0 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    }..  pColl = s
14c00 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
14c10 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
14c20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28  zName, 1);.  if(
14c30 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75   pColl==0 ) retu
14c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
14c50 42 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  BKPT;.  pColl->x
14c60 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a  Cmp = xCompare;.
14c70 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d    pColl->pUser =
14c80 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   pCtx;.  pColl->
14c90 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70  xDel = xDel;.  p
14ca0 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29  Coll->enc = (u8)
14cb0 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53  (enc2 | (enc & S
14cc0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
14cd0 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  NED));.  sqlite3
14ce0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
14cf0 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  _OK);.  return S
14d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
14d10 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64  .** This array d
14d20 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65  efines hard uppe
14d30 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69  r bounds on limi
14d40 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a  t values.  The.*
14d50 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75  * initializer mu
14d60 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79  st be kept in sy
14d70 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  nc with the SQLI
14d80 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64  TE_LIMIT_*.** #d
14d90 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65  efines in sqlite
14da0 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  3.h..*/.static c
14db0 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69  onst int aHardLi
14dc0 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49  mit[] = {.  SQLI
14dd0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20  TE_MAX_LENGTH,. 
14de0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
14df0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
14e00 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53  _MAX_COLUMN,.  S
14e10 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
14e20 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  EPTH,.  SQLITE_M
14e30 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
14e40 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  CT,.  SQLITE_MAX
14e50 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49  _VDBE_OP,.  SQLI
14e60 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
14e70 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ARG,.  SQLITE_MA
14e80 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51  X_ATTACHED,.  SQ
14e90 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
14ea0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20  TTERN_LENGTH,.  
14eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
14ec0 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20  BLE_NUMBER,     
14ed0 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31   /* IMP: R-38091
14ee0 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49  -32352 */.  SQLI
14ef0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
14f00 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  EPTH,.  SQLITE_M
14f10 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
14f20 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  S,.};../*.** Mak
14f30 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20  e sure the hard 
14f40 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74  limits are set t
14f50 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c  o reasonable val
14f60 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ues.*/.#if SQLIT
14f70 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30  E_MAX_LENGTH<100
14f80 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
14f90 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  MAX_LENGTH must 
14fa0 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
14fb0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
14fc0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
14fd0 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
14fe0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_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 3e 53 51 4c 49 54 45 5f  L_LENGTH>SQLITE_
15030 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72  MAX_LENGTH.# err
15040 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
15050 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f  L_LENGTH must no
15060 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
15070 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
15080 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  GTH.#endif.#if S
15090 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
150a0 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72  ND_SELECT<2.# er
150b0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
150c0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d  OMPOUND_SELECT m
150d0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
150e0 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
150f0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c  ITE_MAX_VDBE_OP<
15100 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  40.# error SQLIT
15110 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75  E_MAX_VDBE_OP mu
15120 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
15130 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
15140 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
15150 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45  _ARG<0 || SQLITE
15160 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
15170 47 3e 31 32 37 0a 23 20 65 72 72 6f 72 20 53 51  G>127.# error SQ
15180 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
15190 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
151a0 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 0a  tween 0 and 127.
151b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
151c0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
151d0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
151e0 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72  TTACHED>125.# er
151f0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ror SQLITE_MAX_A
15200 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20  TTACHED must be 
15210 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32  between 0 and 12
15220 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  5.#endif.#if SQL
15230 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
15240 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20  TERN_LENGTH<1.# 
15250 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
15260 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
15270 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
15280 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
15290 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
152a0 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
152b0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
152c0 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
152d0 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
152e0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
152f0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31  _TRIGGER_DEPTH<1
15300 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15310 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
15320 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
15330 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
15340 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
15350 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53  R_THREADS<0 || S
15360 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
15370 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72  _THREADS>50.# er
15380 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ror SQLITE_MAX_W
15390 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75  ORKER_THREADS mu
153a0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
153b0 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a  and 50.#endif...
153c0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
153d0 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
153e0 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
153f0 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
15400 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
15410 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
15420 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
15430 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
15440 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
15450 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
15460 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
15470 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
15480 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
15490 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
154a0 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
154b0 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
154c0 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
154d0 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
154e0 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
154f0 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
15500 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
15510 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
15520 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
15530 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
15540 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
15550 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66  ldLimit;..#ifdef
15560 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
15570 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
15580 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
15590 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
155a0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
155b0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
155c0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
155d0 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e  dif..  /* EVIDEN
155e0 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35  CE-OF: R-30189-5
155f0 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69  4097 For each li
15600 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c  mit category SQL
15610 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20  ITE_LIMIT_NAME. 
15620 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68   ** there is a h
15630 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ard upper bound 
15640 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
15650 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72  ime by a C prepr
15660 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63  ocessor.  ** mac
15670 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45  ro called SQLITE
15680 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20  _MAX_NAME. (The 
15690 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65  "_LIMIT_" in the
156a0 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64   name is changed
156b0 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22   to.  ** "_MAX_"
156c0 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  .).  */.  assert
156d0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
156e0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
156f0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  ]==SQLITE_MAX_LE
15700 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
15710 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15720 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
15730 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
15740 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a  X_SQL_LENGTH );.
15750 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15760 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15770 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54  T_COLUMN]==SQLIT
15780 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  E_MAX_COLUMN );.
15790 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
157a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
157b0 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53  T_EXPR_DEPTH]==S
157c0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
157d0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
157e0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
157f0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
15800 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49  ND_SELECT]==SQLI
15810 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
15820 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72  SELECT);.  asser
15830 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15840 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
15850 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  OP]==SQLITE_MAX_
15860 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73  VDBE_OP );.  ass
15870 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15880 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
15890 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49  CTION_ARG]==SQLI
158a0 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
158b0 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ARG );.  assert(
158c0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
158d0 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
158e0 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  D]==SQLITE_MAX_A
158f0 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73  TTACHED );.  ass
15900 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15910 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
15920 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
15930 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]==.            
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49     SQLITE_MAX_LI
15970 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
15980 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15990 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
159a0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
159b0 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f  NUMBER]==SQLITE_
159c0 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
159d0 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BER);.  assert( 
159e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
159f0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
15a00 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
15a10 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
15a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15a30 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15a40 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
15a50 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EADS]==SQLITE_MA
15a60 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
15a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
15a80 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
15a90 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49  R_THREADS==(SQLI
15aa0 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b  TE_N_LIMIT-1) );
15ab0 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64  ...  if( limitId
15ac0 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53  <0 || limitId>=S
15ad0 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b  QLITE_N_LIMIT ){
15ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
15af0 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d    }.  oldLimit =
15b00 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
15b10 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c  tId];.  if( newL
15b20 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20  imit>=0 ){      
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b40 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37  IMP: R-52476-287
15b50 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  32 */.    if( ne
15b60 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
15b70 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
15b80 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
15b90 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
15ba0 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  d];  /* IMP: R-5
15bb0 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20  1463-25634 */.  
15bc0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
15bd0 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
15be0 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
15bf0 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20  turn oldLimit;  
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33     /* IMP: R-533
15c20 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f  41-35419 */.}../
15c30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15c40 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  on is used to pa
15c50 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e  rse both URIs an
15c60 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  d non-URI filena
15c70 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68  mes passed by th
15c80 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49  e.** user to API
15c90 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74   functions sqlit
15ca0 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c  e3_open() or sql
15cb0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20  ite3_open_v2(), 
15cc0 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65  and for database
15cd0 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69  .** URIs specifi
15ce0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54  ed as part of AT
15cf0 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e  TACH statements.
15d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
15d10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15d20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
15d30 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
15d40 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20  S to use (or.** 
15d50 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66  a NULL to signif
15d60 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  y the default VF
15d70 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f  S) if the URI do
15d80 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
15d90 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75   "vfs=xxx".** qu
15da0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54  ery parameter. T
15db0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15dc0 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  nt contains the 
15dd0 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20  URI (or non-URI 
15de0 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73  filename).** its
15df0 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66  elf. When this f
15e00 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15e10 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61  d the *pFlags va
15e20 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f  riable should co
15e30 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66  ntain.** the def
15e40 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70  ault flags to op
15e50 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
15e60 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65  handle with. The
15e70 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
15e80 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20  .** *pFlags may 
15e90 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72  be updated befor
15ea0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74  e returning if t
15eb0 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20  he URI filename 
15ec0 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61  contains .** "ca
15ed0 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64  che=xxx" or "mod
15ee0 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72  e=xxx" query par
15ef0 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  ameters..**.** I
15f00 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
15f10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15f20 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
15f30 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20  e *ppVfs is set 
15f40 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
15f50 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75  he VFS that shou
15f60 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70  ld be used to op
15f70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
15f80 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73  file. *pzFile is
15f90 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
15fa0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15fb0 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
15fc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15fd0 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20  open. It is the 
15fe0 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
15ff0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
16000 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63   to eventually c
16010 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
16020 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a  () to release.**
16030 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a   this buffer..**
16040 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16050 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20  occurs, then an 
16060 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16070 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
16080 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d  d *pzErrMsg.** m
16090 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
160a0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
160b0 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67  ontaining an Eng
160c0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
160d0 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e  ror .** message.
160e0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
160f0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
16100 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
16110 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a  ually release.**
16120 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20   this buffer by 
16130 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
16140 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  free()..*/.int s
16150 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a  qlite3ParseUri(.
16160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16170 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20  efaultVfs,      
16180 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
16190 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20  if no "vfs=xxx" 
161a0 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  query option */.
161b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
161c0 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ri,             
161d0 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
161e0 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65  ted URI to parse
161f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
16200 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
16210 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
16220 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
16230 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69   flags */.  sqli
16240 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c  te3_vfs **ppVfs,
16250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16260 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a  UT: VFS to use *
16270 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69  / .  char **pzFi
16280 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16290 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c       /* OUT: Fil
162a0 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  ename component 
162b0 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72  of URI */.  char
162c0 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
162d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
162e0 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
162f0 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45  e (if rc!=SQLITE
16300 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  _OK) */.){.  int
16310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16320 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
16330 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b  flags = *pFlags;
16340 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16350 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66  Vfs = zDefaultVf
16360 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  s;.  char *zFile
16370 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  ;.  char c;.  in
16380 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33  t nUri = sqlite3
16390 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a  Strlen30(zUri);.
163a0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72  .  assert( *pzEr
163b0 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  rMsg==0 );..  if
163c0 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  ( ((flags & SQLI
163d0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20  TE_OPEN_URI)    
163e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
163f0 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a   R-48725-32206 *
16400 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  /.            ||
16410 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16420 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f  nfig.bOpenUri) /
16430 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34  * IMP: R-51689-4
16440 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55  6548 */.   && nU
16450 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  ri>=5 && memcmp(
16460 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35  zUri, "file:", 5
16470 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  )==0 /* IMP: R-5
16480 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20  7884-37496 */.  
16490 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70  ){.    char *zOp
164a0 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  t;.    int eStat
164b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
164c0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73       /* Parser s
164d0 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e  tate when parsin
164e0 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74  g URI */.    int
164f0 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   iIn;           
16500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16510 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
16520 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
16530 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
16540 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
16550 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
16560 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42  ex */.    u64 nB
16570 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20  yte = nUri+2;   
16580 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
16590 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
165a0 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ocate */..    /*
165b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53   Make sure the S
165c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66  QLITE_OPEN_URI f
165d0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e  lag is set to in
165e0 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46  dicate to the VF
165f0 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  S xOpen .    ** 
16600 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72  method that ther
16610 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70  e may be extra p
16620 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77  arameters follow
16630 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d  ing the file-nam
16640 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  e.  */.    flags
16650 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16660 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49  URI;..    for(iI
16670 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69  n=0; iIn<nUri; i
16680 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28  In++) nByte += (
16690 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b  zUri[iIn]=='&');
166a0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
166b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
166c0 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  yte);.    if( !z
166d0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
166e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
166f0 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23  ..    iIn = 5;.#
16700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c  ifdef SQLITE_ALL
16710 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59  OW_URI_AUTHORITY
16720 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
16730 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20  (zUri+5, "///", 
16740 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
16750 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a  In = 7;.      /*
16760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
16770 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20  ondition causes 
16780 55 52 49 73 20 77 69 74 68 20 66 69 76 65 20 6c  URIs with five l
16790 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74  eading / charact
167a0 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b  ers.      ** lik
167b0 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74  e file://///host
167c0 2f 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76  /path to be conv
167d0 65 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20  erted into UNCs 
167e0 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68  like //host/path
167f0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63  ..      ** The c
16800 6f 72 72 65 63 74 20 55 52 49 20 66 6f 72 20 74  orrect URI for t
16810 68 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79  hat UNC has only
16820 20 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61   two or four lea
16830 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72  ding / character
16840 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a  s.      ** file:
16850 2f 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66  //host/path or f
16860 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  ile:////host/pat
16870 68 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e  h.  But 5 leadin
16880 67 20 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a  g slashes is a .
16890 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20        ** common 
168a0 65 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f  error, we are to
168b0 6c 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65  ld, so we handle
168c0 20 69 74 20 61 73 20 61 20 73 70 65 63 69 61 6c   it as a special
168d0 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20   case. */.      
168e0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
168f0 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +7, "///", 3)==0
16900 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20   ){ iIn++; }.   
16910 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
16920 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f  mp(zUri+5, "//lo
16930 63 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d  calhost/", 12)==
16940 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
16950 20 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   16;.    }.#else
16960 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
16970 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61  the scheme and a
16980 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74  uthority segment
16990 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f  s of the URI. */
169a0 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d  .    if( zUri[5]
169b0 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d  =='/' && zUri[6]
169c0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
169d0 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68  In = 7;.      wh
169e0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
169f0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27  & zUri[iIn]!='/'
16a00 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
16a10 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69  if( iIn!=7 && (i
16a20 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70  In!=16 || memcmp
16a30 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a  ("localhost", &z
16a40 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20  Uri[7], 9)) ){. 
16a50 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
16a60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16a70 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20  tf("invalid uri 
16a80 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22  authority: %.*s"
16a90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
16aa0 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b  In-7, &zUri[7]);
16ab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
16ac0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16ad0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
16ae0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ri_out;.      }.
16af0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
16b00 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69    /* Copy the fi
16b10 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71  lename and any q
16b20 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
16b30 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62  into the zFile b
16b40 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44  uffer. .    ** D
16b50 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65  ecode %HH escape
16b60 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65   codes along the
16b70 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20   way. .    **.  
16b80 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73    ** Within this
16b90 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20   loop, variable 
16ba0 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65  eState may be se
16bb0 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20  t to 0, 1 or 2, 
16bc0 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
16bd0 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20   on the parsing 
16be0 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c  context. As foll
16bf0 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
16c00 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20  **   0: Parsing 
16c10 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a  file-name..    *
16c20 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e  *   1: Parsing n
16c30 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  ame section of a
16c40 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
16c50 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
16c60 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67   **   2: Parsing
16c70 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f   value section o
16c80 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
16c90 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
16ca0 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74      */.    eStat
16cb0 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  e = 0;.    while
16cc0 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
16cd0 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29  )!=0 && c!='#' )
16ce0 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
16cf0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
16d00 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
16d10 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
16d20 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26  iIn]) .       &&
16d30 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
16d40 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20  (zUri[iIn+1]) . 
16d50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16d60 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c  int octet = (sql
16d70 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
16d80 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b  i[iIn++]) << 4);
16d90 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b  .        octet +
16da0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  = sqlite3HexToIn
16db0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a  t(zUri[iIn++]);.
16dc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16dd0 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74   octet>=0 && oct
16de0 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20  et<256 );.      
16df0 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29    if( octet==0 )
16e00 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16e10 5f 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45  _ENABLE_URI_00_E
16e20 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 2f  RROR.          /
16e30 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
16e40 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
16e50 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
16e60 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
16e70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
16e80 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
16e90 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
16ea0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
16eb0 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
16ec0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
16ed0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
16ee0 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
16ef0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
16f00 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
16f10 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
16f20 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
16f30 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
16f40 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
16f50 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
16f60 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
16f70 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
16f80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
16f90 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
16fa0 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
16fb0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
16fc0 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
16fd0 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
16fe0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
16ff0 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
17000 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17010 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
17020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17030 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65      continue;.#e
17040 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  lse.          /*
17050 20 49 66 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30   If ENABLE_URI_0
17060 30 5f 45 52 52 4f 52 20 69 73 20 64 65 66 69 6e  0_ERROR is defin
17070 65 64 2c 20 22 25 30 30 22 20 69 6e 20 61 20 55  ed, "%00" in a U
17080 52 49 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  RI is an error. 
17090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  */.          *pz
170a0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
170b0 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65  _mprintf("unexpe
170c0 63 74 65 64 20 25 25 30 30 20 69 6e 20 75 72 69  cted %%00 in uri
170d0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
170e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
170f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
17100 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23  parse_uri_out;.#
17110 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
17120 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65          c = octe
17130 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
17140 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20  f( eState==1 && 
17150 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d  (c=='&' || c=='=
17160 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
17170 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d  ( zFile[iOut-1]=
17180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17190 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69  /* An empty opti
171a0 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20  on name. Ignore 
171b0 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f  this option alto
171c0 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gether. */.     
171d0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
171e0 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
171f0 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b  n]!='#' && zUri[
17200 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49  iIn-1]!='&' ) iI
17210 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
17220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
17230 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
17240 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20  =='&' ){.       
17250 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
17260 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
17270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17280 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20    eState = 2;.  
17290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
172a0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
172b0 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d  se if( (eState==
172c0 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20  0 && c=='?') || 
172d0 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d  (eState==2 && c=
172e0 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='&') ){.       
172f0 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
17300 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
17310 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b    }.      zFile[
17320 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  iOut++] = c;.   
17330 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74   }.    if( eStat
17340 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75  e==1 ) zFile[iOu
17350 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
17360 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
17370 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
17380 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
17390 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
173a0 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79  f there were any
173b0 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69   options specifi
173c0 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
173d0 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20  e interpreted . 
173e0 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69     ** here. Opti
173f0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74  ons that are int
17400 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e  erpreted here in
17410 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20  clude "vfs" and 
17420 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a  those that.    *
17430 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  * correspond to 
17440 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62  flags that may b
17450 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
17460 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
17470 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e  ).    ** method.
17480 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26   */.    zOpt = &
17490 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72  zFile[sqlite3Str
174a0 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b  len30(zFile)+1];
174b0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74  .    while( zOpt
174c0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
174d0 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53   nOpt = sqlite3S
174e0 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20  trlen30(zOpt);. 
174f0 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20       char *zVal 
17500 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b  = &zOpt[nOpt+1];
17510 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20  .      int nVal 
17520 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17530 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20  0(zVal);..      
17540 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d  if( nOpt==3 && m
17550 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70  emcmp("vfs", zOp
17560 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 3)==0 ){.    
17570 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b      zVfs = zVal;
17580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17590 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65        struct Ope
175a0 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20  nMode {.        
175b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
175c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
175d0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a  ode;.        } *
175e0 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aMode = 0;.     
175f0 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79     char *zModeTy
17600 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pe = 0;.        
17610 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  int mask = 0;.  
17620 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20        int limit 
17630 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  = 0;..        if
17640 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d  ( nOpt==5 && mem
17650 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70  cmp("cache", zOp
17660 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 5)==0 ){.    
17670 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
17680 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61  uct OpenMode aCa
17690 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  cheMode[] = {.  
176a0 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61            { "sha
176b0 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  red",  SQLITE_OP
176c0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
176d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
176e0 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54  "private", SQLIT
176f0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
17700 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
17710 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
17720 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
17730 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
17740 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
17750 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  HE|SQLITE_OPEN_P
17760 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20  RIVATECACHE;.   
17770 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
17780 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20  CacheMode;.     
17790 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
177a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  k;.          zMo
177b0 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22  deType = "cache"
177c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
177d0 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20      if( nOpt==4 
177e0 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22  && memcmp("mode"
177f0 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b  , zOpt, 4)==0 ){
17800 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
17810 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
17820 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20  e aOpenMode[] = 
17830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
17840 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "ro",  SQLITE_OP
17850 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20  EN_READONLY },. 
17860 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
17870 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17880 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20  READWRITE }, .  
17890 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63            { "rwc
178a0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
178b0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
178c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
178d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
178e0 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f  memory", SQLITE_
178f0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20  OPEN_MEMORY },. 
17900 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
17910 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
17920 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
17930 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
17940 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45  EADONLY | SQLITE
17950 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
17980 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
17990 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20  _OPEN_MEMORY;.  
179a0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
179b0 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20  aOpenMode;.     
179c0 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
179d0 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  k & flags;.     
179e0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
179f0 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20   "access";.     
17a00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
17a10 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( aMode ){.     
17a20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
17a30 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d        int mode =
17a40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
17a50 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e  r(i=0; aMode[i].
17a60 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
17a70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
17a80 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  *z = aMode[i].z;
17a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
17aa0 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74   nVal==sqlite3St
17ab0 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d  rlen30(z) && 0==
17ac0 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20  memcmp(zVal, z, 
17ad0 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
17ae0 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d         mode = aM
17af0 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20  ode[i].mode;.   
17b00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17b20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17b30 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d        if( mode==
17b40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
17b50 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
17b60 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
17b70 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25   such %s mode: %
17b80 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a  s", zModeType, z
17b90 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
17ba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
17bb0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
17bc0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
17bd0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
17be0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
17bf0 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f  mode & ~SQLITE_O
17c00 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69  PEN_MEMORY)>limi
17c10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17c20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
17c30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17c40 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   mode not allowe
17c50 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  d: %s",.        
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c80 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
17c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
17ca0 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a   = SQLITE_PERM;.
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
17cc0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
17cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17ce0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66        flags = (f
17cf0 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20  lags & ~mask) | 
17d00 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mode;.        }.
17d10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
17d20 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c  Opt = &zVal[nVal
17d30 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  +1];.    }..  }e
17d40 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  lse{.    zFile =
17d50 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
17d60 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  4(nUri+2);.    i
17d70 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
17d80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
17d90 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 55  BKPT;.    if( nU
17da0 72 69 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ri ){.      memc
17db0 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20  py(zFile, zUri, 
17dc0 6e 55 72 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nUri);.    }.   
17dd0 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27   zFile[nUri] = '
17de0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  \0';.    zFile[n
17df0 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Uri+1] = '\0';. 
17e00 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
17e10 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
17e20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71  }..  *ppVfs = sq
17e30 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
17e40 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56  Vfs);.  if( *ppV
17e50 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  fs==0 ){.    *pz
17e60 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
17e70 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
17e80 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73  h vfs: %s", zVfs
17e90 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
17ea0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70  TE_ERROR;.  }. p
17eb0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20  arse_uri_out:.  
17ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17ed0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
17ee0 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  _free(zFile);.  
17ef0 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d    zFile = 0;.  }
17f00 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61  .  *pFlags = fla
17f10 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20  gs;.  *pzFile = 
17f20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  zFile;.  return 
17f30 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
17f40 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
17f50 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e  the work of open
17f60 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f  ing a database o
17f70 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73  n behalf of.** s
17f80 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e  qlite3_open() an
17f90 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  d sqlite3_open16
17fa0 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  (). The database
17fb0 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65   filename "zFile
17fc0 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54  name"  .** is UT
17fd0 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  F-8 encoded..*/.
17fe0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
17ff0 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74  atabase(.  const
18000 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18010 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69  , /* Database fi
18020 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63  lename UTF-8 enc
18030 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  oded */.  sqlite
18040 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
18050 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65   /* OUT: Returne
18060 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
18070 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
18080 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a  int flags,    /*
18090 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61   Operational fla
180a0 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
180b0 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f  ar *zVfs       /
180c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  * Name of the VF
180d0 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  S to use */.){. 
180e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61   /* Store alloca
18110 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ted handle here 
18120 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
18150 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ode */.  int isT
18160 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20  hreadsafe;      
18170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18180 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20   for threadsafe 
18190 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
181a0 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30   char *zOpen = 0
181b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
181c0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67   /* Filename arg
181d0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
181e0 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a   BtreeOpen() */.
181f0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
18200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18210 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
18220 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50  ge from sqlite3P
18230 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69  arseUri() */..#i
18240 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18250 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
18260 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
18270 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
18280 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
18290 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
182a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
182b0 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
182c0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
182d0 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
182e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
182f0 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
18300 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
18310 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
18320 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
18330 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
18340 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
18350 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
18360 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
18370 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
18380 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
18390 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
183a0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
183b0 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
183c0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
183d0 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
183e0 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
183f0 74 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  tex;.  }..  if( 
18400 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
18410 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
18420 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   ){.    flags &=
18430 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   ~SQLITE_OPEN_SH
18440 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c  AREDCACHE;.  }el
18450 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
18460 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
18470 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
18480 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
18490 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
184a0 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CACHE;.  }..  /*
184b0 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
184c0 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
184d0 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ags parameter.  
184e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49  **.  ** The SQLI
184f0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
18500 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  and SQLITE_OPEN_
18510 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20  FULLMUTEX flags 
18520 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20  were.  ** dealt 
18530 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76  with in the prev
18540 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e  ious code block.
18550 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c    Besides these,
18560 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76   the only.  ** v
18570 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73  alid input flags
18580 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65   for sqlite3_ope
18590 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54  n_v2() are SQLIT
185a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
185b0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
185c0 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c  N_READWRITE, SQL
185d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
185e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
185f0 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53  REDCACHE,.  ** S
18600 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
18610 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d  TECACHE, and som
18620 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e  e reserved bits.
18630 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a    Silently mask.
18640 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68    ** off all oth
18650 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20  er flags..  */. 
18660 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
18670 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
18680 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
18690 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
186a0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
186b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
186c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
186d0 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _DB |.          
186e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
186f0 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20  _TEMP_DB | .    
18700 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18710 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
18720 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
18730 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18740 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
18750 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18760 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
18770 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  P_JOURNAL | .   
18780 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18790 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
187a0 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
187b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
187c0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
187d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
187e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
187f0 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20  UTEX |.         
18800 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18810 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20  N_FULLMUTEX |.  
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18830 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20  ITE_OPEN_WAL.   
18840 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
18850 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
18860 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
18870 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
18880 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18890 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
188a0 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
188b0 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
188c0 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
188d0 65 61 64 73 61 66 65 20 0a 23 69 66 64 65 66 20  eadsafe .#ifdef 
188e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55  SQLITE_ENABLE_MU
188f0 4c 54 49 54 48 52 45 41 44 45 44 5f 43 48 45 43  LTITHREADED_CHEC
18900 4b 53 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  KS.   || sqlite3
18910 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
18920 72 65 4d 75 74 65 78 0a 23 65 6e 64 69 66 0a 20  reMutex.#endif. 
18930 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65   ){.    db->mute
18940 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
18950 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
18960 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
18970 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78     if( db->mutex
18980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18990 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20  ite3_free(db);. 
189a0 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20       db = 0;.   
189b0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
189c0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
189d0 28 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  ( isThreadsafe==
189e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
189f0 65 33 4d 75 74 65 78 57 61 72 6e 4f 6e 43 6f 6e  e3MutexWarnOnCon
18a00 74 65 6e 74 69 6f 6e 28 64 62 2d 3e 6d 75 74 65  tention(db->mute
18a10 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
18a20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18a30 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18a40 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
18a50 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  0xff;.  db->nDb 
18a60 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  = 2;.  db->magic
18a70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
18a80 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20  BUSY;.  db->aDb 
18a90 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
18aa0 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
18ab0 2e 62 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 0a  .bDisable = 1;..
18ac0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
18ad0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
18ae0 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
18af0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
18b00 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
18b10 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
18b20 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
18b30 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
18b40 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
18b50 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
18b60 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
18b70 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
18b80 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
18b90 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
18ba0 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
18bb0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
18bc0 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
18bd0 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
18be0 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
18bf0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
18c00 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
18c10 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
18c20 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
18c30 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
18c40 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
18c50 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
18c60 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
18c70 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
18c80 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
18c90 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
18ca0 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
18cb0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
18cc0 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
18cd0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
18ce0 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59  AULT_CKPTFULLFSY
18cf0 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NC.             
18d00 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70      | SQLITE_Ckp
18d10 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69  tFullFSync.#endi
18d20 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
18d30 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
18d40 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
18d50 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
18d60 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
18d70 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
18d80 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
18d90 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
18da0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18db0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
18dc0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
18dd0 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
18de0 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
18df0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
18e00 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
18e10 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
18e20 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
18e30 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
18e40 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
18e50 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
18e80 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
18e90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18ea0 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
18eb0 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
18ed0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
18ee0 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
18ef0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18f00 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
18f10 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20  _CHECK).        
18f20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
18f30 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e  E_CellSizeCk.#en
18f40 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18f50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
18f60 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20  S3_TOKENIZER).  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18f80 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65   SQLITE_Fts3Toke
18f90 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69 66  nizer.#endif.#if
18fa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18fb0 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a 20 20 20  ENABLE_QPSG).   
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18fd0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
18fe0 47 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b  G.#endif.      ;
18ff0 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
19000 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  it(&db->aCollSeq
19010 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
19020 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19030 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
19040 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
19050 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  le);.#endif..  /
19060 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c  * Add the defaul
19070 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
19080 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e  ence BINARY. BIN
19090 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  ARY works for bo
190a0 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e  th UTF-8.  ** an
190b0 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64  d UTF-16, so add
190c0 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65   a version for e
190d0 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79  ach to avoid any
190e0 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a   unnecessary.  *
190f0 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54  * conversions. T
19100 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68  he only error th
19110 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72  at can occur her
19120 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e is a malloc() 
19130 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20  failure..  **.  
19140 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
19150 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51  R-52786-44878 SQ
19160 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72  Lite defines thr
19170 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  ee built-in coll
19180 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74  ating.  ** funct
19190 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65  ions:.  */.  cre
191a0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
191b0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
191c0 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  Y, SQLITE_UTF8, 
191d0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
191e0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
191f0 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
19200 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
19210 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
19220 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
19230 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
19240 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72  n(db, sqlite3Str
19250 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55  BINARY, SQLITE_U
19260 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16LE, 0, binCo
19270 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
19280 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19290 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
192a0 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61  TE_UTF8, 0, noca
192b0 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c  seCollatingFunc,
192c0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
192d0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
192e0 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
192f0 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
19300 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
19310 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19320 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
19330 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
19340 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19350 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54   R-08308-17224 T
19360 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
19370 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
19380 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e  r all.  ** strin
19390 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20  gs is BINARY. . 
193a0 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43   */.  db->pDfltC
193b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
193c0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
193d0 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
193e0 33 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a  3StrBINARY, 0);.
193f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
19400 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
19410 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
19420 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
19430 65 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e  ent.  **.  ** On
19440 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c  ly allow sensibl
19450 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  e combinations o
19460 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c  f bits in the fl
19470 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  ags argument.  .
19480 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72    ** Throw an er
19490 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73  ror if any non-s
194a0 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ense combination
194b0 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65   is used.  If we
194c0 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f  .  ** do not blo
194d0 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69  ck illegal combi
194e0 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74  nations here, it
194f0 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20   could trigger. 
19500 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61   ** assert() sta
19510 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65  tements in deepe
19520 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69  r layers.  Sensi
19530 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
19540 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a  .  ** are:.  **.
19550 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45    **  1:  SQLITE
19560 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20  _OPEN_READONLY. 
19570 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f   **  2:  SQLITE_
19580 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
19590 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f   **  6:  SQLITE_
195a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
195b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
195c0 41 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f  ATE.  */.  db->o
195d0 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
195e0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
195f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
19600 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
19610 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
19620 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
19630 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
19640 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
19650 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
19660 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
19670 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
19680 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
19690 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
196a0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
196b0 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
196c0 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
196d0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
196e0 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
196f0 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
19700 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
19710 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
19720 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  x46)==0 ){.    r
19730 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
19740 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a  E_BKPT;  /* IMP:
19750 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a   R-65497-44594 *
19760 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  /.  }else{.    r
19770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
19780 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
19790 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
197a0 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
197b0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  &zErrMsg);.  }. 
197c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
197d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
197e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
197f0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
19800 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
19810 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
19820 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20  , rc, zErrMsg ? 
19830 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73  "%s" : 0, zErrMs
19840 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
19850 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
19860 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
19870 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ut;.  }..  /* Op
19880 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
19890 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
198a0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
198b0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
198c0 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26  fs, zOpen, db, &
198d0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
198e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
198f0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
19900 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
19910 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72  AIN_DB);.  if( r
19920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19940 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
19950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19960 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19970 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19980 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
19990 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
199a0 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  out;.  }.  sqlit
199b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d  e3BtreeEnter(db-
199c0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
199d0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
199e0 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
199f0 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44  maGet(db, db->aD
19a00 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
19a10 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19a20 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53  ed ) ENC(db) = S
19a30 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20  CHEMA_ENC(db);. 
19a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19a50 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ve(db->aDb[0].pB
19a60 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
19a70 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
19a80 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
19a90 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  0);..  /* The de
19aa0 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
19ab0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
19ac0 64 61 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c  database is FULL
19ad0 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20  ; for the temp. 
19ae0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20   ** database it 
19af0 69 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74  is OFF. This mat
19b00 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
19b10 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
19b20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
19b30 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d  0].zDbSName = "m
19b40 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  ain";.  db->aDb[
19b50 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  0].safety_level 
19b60 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
19b70 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a  _SYNCHRONOUS+1;.
19b80 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62    db->aDb[1].zDb
19b90 53 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  SName = "temp";.
19ba0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
19bb0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45  ety_level = PAGE
19bc0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
19bd0 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  F;..  db->magic 
19be0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
19bf0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
19c00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19c10 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
19c20 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
19c30 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
19c40 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
19c50 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
19c60 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
19c70 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
19c80 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
19c90 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
19ca0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
19cb0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
19cc0 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
19cd0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
19ce0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
19cf0 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
19d00 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75  rPerConnectionBu
19d10 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
19d20 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
19d30 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
19d40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19d50 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20  NABLE_FTS5.  /* 
19d60 52 65 67 69 73 74 65 72 20 61 6e 79 20 62 75 69  Register any bui
19d70 6c 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c  lt-in FTS5 modul
19d80 65 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67  e before loading
19d90 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20   the automatic. 
19da0 20 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20   ** extensions. 
19db0 54 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f  This allows auto
19dc0 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
19dd0 20 74 6f 20 72 65 67 69 73 74 65 72 20 46 54 53   to register FTS
19de0 35 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65  5 .  ** tokenize
19df0 72 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79  rs and auxiliary
19e00 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a   functions.  */.
19e10 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
19e20 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
19e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
19e50 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
19e60 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  ndif..  /* Load 
19e70 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
19e80 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e  ions - extension
19e90 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
19ea0 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a   registered.  **
19eb0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
19ec0 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74  e3_automatic_ext
19ed0 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
19ee0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
19ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
19f00 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
19f10 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
19f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
19f30 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
19f40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19f50 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
19f60 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
19f70 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
19f80 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
19f90 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
19fa0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
19fb0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
19fc0 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
19fd0 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
19fe0 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
19ff0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a010 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
1a020 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a030 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a040 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
1a050 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
1a060 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
1a070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1a080 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
1a090 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a0a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1a0b0 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61  S3 /* automatica
1a0c0 6c 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53  lly defined by S
1a0d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1a0e0 34 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e  4 */.  if( !db->
1a0f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1a100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a120 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
1a130 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
1a140 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1a150 41 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66  ABLE_ICU) || def
1a160 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1a170 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e  LE_ICU_COLLATION
1a180 53 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S).  if( !db->ma
1a190 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1a1c0 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
1a1d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a1e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
1a1f0 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
1a200 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1a220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
1a230 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
1a240 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a250 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
1a260 50 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28 20  PAGE_VTAB.  if( 
1a270 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a280 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a290 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
1a2a0 6c 69 74 65 33 44 62 70 61 67 65 52 65 67 69 73  lite3DbpageRegis
1a2b0 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ter(db);.  }.#en
1a2c0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a2d0 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54  TE_ENABLE_DBSTAT
1a2e0 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  _VTAB.  if( !db-
1a2f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1a310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a320 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28  3DbstatRegister(
1a330 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1a340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a350 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66  NABLE_JSON1.  if
1a360 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a370 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a380 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
1a390 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
1a3a0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a3b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a3c0 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a  ENABLE_STMTVTAB.
1a3d0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a3e0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a3f0 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a400 63 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74 56  c = sqlite3StmtV
1a410 74 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  tabInit(db);.  }
1a420 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44  .#endif..  /* -D
1a430 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
1a440 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
1a450 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
1a460 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
1a470 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
1a480 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
1a490 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
1a4a0 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
1a4b0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
1a4c0 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
1a4d0 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
1a4e0 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
1a4f0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
1a500 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1a510 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1a520 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
1a530 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
1a540 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1a550 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
1a560 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
1a570 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
1a580 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
1a590 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a5b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1a5c0 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
1a5d0 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20  dif..  if( rc ) 
1a5e0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
1a5f0 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62   rc);..  /* Enab
1a600 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
1a610 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
1a620 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
1a630 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
1a640 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a650 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1a680 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
1a690 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
1a6a0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
1a6b0 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
1a6c0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
1a6d0 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
1a6e0 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20  endb_out:.  if( 
1a6f0 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
1a700 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
1a710 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
1a720 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
1a730 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a740 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d  fig.bFullMutex==
1a750 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1a760 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a770 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72  >mutex);.  }.  r
1a780 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
1a790 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ode(db);.  asser
1a7a0 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d  t( db!=0 || rc==
1a7b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1a7c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a7d0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
1a7e0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
1a7f0 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
1a800 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
1a810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
1a820 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1a830 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
1a840 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23  .  *ppDb = db;.#
1a850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a860 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
1a870 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a880 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
1a890 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61      /* Opening a
1a8a0 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72   db handle. Four
1a8b0 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
1a8c0 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20  passed 0. */.   
1a8d0 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71   void *pArg = sq
1a8e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a8f0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20  g.pSqllogArg;.  
1a900 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1a910 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41  onfig.xSqllog(pA
1a920 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d  rg, db, zFilenam
1a930 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  e, 0);.  }.#endi
1a940 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
1a950 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a  LITE_HAS_CODEC).
1a960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a970 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
1a980 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20   char *zKey;.   
1a990 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c   if( (zKey = sql
1a9a0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1a9b0 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65  er(zOpen, "hexke
1a9c0 79 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b  y"))!=0 && zKey[
1a9d0 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  0] ){.      u8 i
1a9e0 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
1a9f0 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 44  i;.      char zD
1aa00 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20  ecoded[40];.    
1aa10 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
1aa20 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65  =0; i<sizeof(zDe
1aa30 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69  coded)*2 && sqli
1aa40 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79  te3Isxdigit(zKey
1aa50 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [i]); i++){.    
1aa60 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79      iByte = (iBy
1aa70 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33  te<<4) + sqlite3
1aa80 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d  HexToInt(zKey[i]
1aa90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1aaa0 69 26 31 29 21 3d 30 20 29 20 7a 44 65 63 6f 64  i&1)!=0 ) zDecod
1aab0 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ed[i/2] = iByte;
1aac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1aad0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
1aae0 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69  , 0, zDecoded, i
1aaf0 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  /2);.    }else i
1ab00 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74  f( (zKey = sqlit
1ab10 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1ab20 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22 29 29 21  (zOpen, "key"))!
1ab30 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1ab40 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
1ab50 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65 33 53  , zKey, sqlite3S
1ab60 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a  trlen30(zKey));.
1ab70 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1ab80 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1ab90 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  zOpen);.  return
1aba0 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f   rc & 0xff;.}../
1abb0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1abc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
1abd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1abe0 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
1abf0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
1ac00 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1ac10 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
1ac20 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
1ac30 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1ac60 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1ac70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
1ac80 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
1ac90 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
1aca0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
1acb0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
1acc0 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
1acd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
1ace0 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
1acf0 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
1ad00 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
1ad10 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1ad20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
1ad30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1ad40 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
1ad50 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
1ad60 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
1ad70 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
1ad80 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
1ad90 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
1ada0 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
1adb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1adc0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1add0 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
1ade0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
1adf0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1ae00 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
1ae10 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
1ae20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
1ae30 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
1ae40 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
1ae50 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
1ae60 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
1ae70 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
1ae80 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1ae90 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
1aea0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1aeb0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1aec0 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
1aed0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1aee0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1aef0 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
1af00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1af10 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
1af20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
1af30 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
1af40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1af50 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46  .#endif.  if( zF
1af60 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69  ilename==0 ) zFi
1af70 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30  lename = "\000\0
1af80 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  00";.  pVal = sq
1af90 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
1afa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
1afb0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
1afc0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
1afd0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
1afe0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1aff0 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
1b000 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1b010 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
1b020 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
1b030 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
1b040 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
1b050 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b080 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1b090 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1b0a0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1b0b0 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
1b0c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1b0d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b0e0 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
1b0f0 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
1b100 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
1b110 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d  ) ){.      SCHEM
1b120 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45  A_ENC(*ppDb) = E
1b130 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
1b140 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
1b150 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b170 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
1b180 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1b190 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
1b1a0 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a  rn rc & 0xff;.}.
1b1b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b1c0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1b1d0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1b1e0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
1b1f0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
1b200 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1b210 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1b220 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1b230 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
1b240 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
1b250 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
1b260 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1b270 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1b280 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1b290 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1b2a0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
1b2b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1b2c0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1b2d0 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c  on_v2(db, zName,
1b2e0 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d   enc, pCtx, xCom
1b2f0 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pare, 0);.}../*.
1b300 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1b310 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1b320 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1b330 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1b340 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b350 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1b360 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
1b370 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
1b380 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
1b390 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1b3a0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1b3b0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1b3c0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1b3d0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
1b3e0 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
1b3f0 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
1b400 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b410 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1b420 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1b430 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1b440 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72   || zName==0 ) r
1b450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b460 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1b470 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b480 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
1b4a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1b4b0 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
1b4c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
1b4d0 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  me, (u8)enc, pCt
1b4e0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
1b4f0 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
1b500 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1b510 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1b520 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1b530 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1b540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b550 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1b560 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1b570 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
1b580 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
1b590 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1b5a0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
1b5b0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1b5c0 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
1b5d0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
1b5e0 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
1b5f0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1b600 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1b610 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1b620 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1b630 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
1b640 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b650 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
1b660 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53  Name8;..#ifdef S
1b670 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b680 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1b690 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1b6a0 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
1b6b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b6c0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b6d0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b6e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b6f0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
1b700 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
1b710 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
1b720 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
1b730 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
1b740 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
1b750 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
1b760 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
1b770 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
1b780 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
1b790 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
1b7a0 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  are, 0);.    sql
1b7b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1b7c0 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63  Name8);.  }.  rc
1b7d0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1b7e0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1b7f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b800 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1b820 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b830 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
1b840 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
1b850 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b860 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
1b870 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1b880 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
1b890 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
1b8a0 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
1b8b0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
1b8c0 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
1b8d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
1b8e0 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20  lation_needed(. 
1b8f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1b900 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
1b910 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
1b920 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69  xCollNeeded)(voi
1b930 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
1b940 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63  eTextRep,const c
1b950 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20  har*).){.#ifdef 
1b960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1b970 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1b980 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1b990 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1b9a0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1b9b0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1b9c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b9d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1b9e0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
1b9f0 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20  = xCollNeeded;. 
1ba00 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1ba10 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43  16 = 0;.  db->pC
1ba20 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
1ba30 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
1ba40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1ba50 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1ba60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ba70 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1ba80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1ba90 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
1baa0 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
1bab0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
1bac0 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
1bad0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
1bae0 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
1baf0 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
1bb00 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
1bb10 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1bb20 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
1bb30 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
1bb40 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ded16(.  sqlite3
1bb50 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
1bb60 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
1bb70 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
1bb80 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c  ded16)(void*,sql
1bb90 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
1bba0 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  ep,const void*).
1bbb0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1bbc0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1bbd0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1bbe0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1bbf0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1bc00 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1bc10 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1bc20 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1bc30 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
1bc40 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
1bc50 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1bc60 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
1bc70 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
1bc80 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1bc90 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1bca0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1bcb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1bcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bcd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1bce0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1bcf0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1bd00 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1bd10 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
1bd20 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
1bd30 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
1bd40 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
1bd50 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
1bd60 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
1bd70 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
1bd80 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
1bd90 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
1bda0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
1bdb0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
1bdc0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
1bdd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1bde0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
1bdf0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1be00 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
1be10 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
1be20 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
1be30 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
1be40 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
1be50 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
1be60 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
1be70 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
1be80 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
1be90 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
1bea0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
1beb0 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
1bec0 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
1bed0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
1bee0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1bef0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
1bf00 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
1bf10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bf20 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1bf30 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1bf40 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1bf50 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1bf60 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1bf70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
1bf80 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
1bf90 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
1bfa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1bfb0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
1bfc0 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66  re substitutes f
1bfd0 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c  or constants SQL
1bfe0 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20  ITE_CORRUPT,.** 
1bff0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53  SQLITE_MISUSE, S
1c000 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1c010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1c020 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20   possibly other 
1c030 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  error.** constan
1c040 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20  ts.  They serve 
1c050 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
1c060 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
1c070 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
1c080 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
1c090 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
1c0a0 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
1c0b0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
1c0c0 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
1c0d0 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
1c0e0 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
1c0f0 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
1c100 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
1c110 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
1c120 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
1c130 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
1c140 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
1c150 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
1c160 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1c170 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e  ror(int iErr, in
1c180 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
1c190 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20  char *zType){.  
1c1a0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72  sqlite3_log(iErr
1c1b0 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64  , "%s at line %d
1c1c0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
1c1e0 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71  e, lineno, 20+sq
1c1f0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
1c200 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72  );.  return iErr
1c210 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
1c220 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
1c230 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1c240 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1c250 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1c260 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1c270 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1c280 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1c290 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73  lineno, "databas
1c2a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a  e corruption");.
1c2b0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
1c2c0 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
1c2d0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1c2e0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1c2f0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1c300 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c310 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1c320 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65  ITE_MISUSE, line
1c330 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d  no, "misuse");.}
1c340 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
1c350 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
1c360 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1c370 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1c380 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1c390 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1c3a0 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1c3b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c  LITE_CANTOPEN, l
1c3c0 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f  ineno, "cannot o
1c3d0 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69  pen file");.}.#i
1c3e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c3f0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  G.int sqlite3Cor
1c400 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e  ruptPgnoError(in
1c410 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70  t lineno, Pgno p
1c420 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  gno){.  char zMs
1c430 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  g[100];.  sqlite
1c440 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1c450 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22  f(zMsg), zMsg, "
1c460 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1c470 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67  ion page %d", pg
1c480 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  no);.  testcase(
1c490 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c4a0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1c4b0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c4c0 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1c4d0 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1c4e0 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74  no, zMsg);.}.int
1c4f0 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72   sqlite3NomemErr
1c500 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1c510 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1c520 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c530 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1c540 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1c550 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f  tError(SQLITE_NO
1c560 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f  MEM, lineno, "OO
1c570 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  M");.}.int sqlit
1c580 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f  e3IoerrnomemErro
1c590 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1c5a0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1c5b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1c5c0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1c5d0 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  rn sqlite3Report
1c5e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c5f0 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f  RR_NOMEM, lineno
1c600 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72  , "I/O OOM error
1c610 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ");.}.#endif..#i
1c620 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c630 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1c640 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
1c650 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
1c660 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
1c670 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
1c680 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
1c690 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
1c6a0 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
1c6b0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
1c6c0 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
1c6d0 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
1c6e0 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
1c6f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
1c700 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
1c710 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
1c720 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
1c730 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
1c740 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
1c750 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
1c760 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c770 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
1c780 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
1c790 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
1c7a0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
1c7b0 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
1c7c0 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
1c7d0 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
1c7e0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69  or details..*/.i
1c7f0 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
1c800 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1c810 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
1c840 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
1c850 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
1c860 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c870 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
1c880 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1c890 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
1c8a0 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
1c8b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c8c0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
1c8d0 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
1c8e0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1c8f0 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
1c900 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
1c910 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
1c920 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
1c930 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
1c940 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
1c950 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
1c960 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
1c970 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
1c980 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1c990 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
1c9a0 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
1c9b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
1c9c0 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
1c9d0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1c9e0 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
1c9f0 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
1ca00 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
1ca10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1ca20 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
1ca30 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
1ca40 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
1ca50 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
1ca60 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
1ca70 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
1ca80 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
1ca90 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20   int iCol = 0;. 
1caa0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
1cab0 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
1cac0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
1cad0 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
1cae0 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
1caf0 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
1cb00 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
1cb10 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   0;...#ifdef SQL
1cb20 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1cb30 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1cb40 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1cb50 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61  (db) || zTableNa
1cb60 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1cb70 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1cb80 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
1cb90 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
1cba0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1cbb0 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
1cbc0 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
1cbd0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1cbe0 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
1cbf0 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
1cc00 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
1cc10 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
1cc20 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
1cc30 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1cc40 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1cc50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
1cc60 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
1cc70 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
1cc80 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1cc90 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
1cca0 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
1ccb0 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
1ccc0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
1ccd0 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
1cce0 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1ccf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
1cd00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
1cd10 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
1cd20 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
1cd30 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20   zColumnName==0 
1cd40 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20  ){.    /* Query 
1cd50 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66  for existance of
1cd60 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20   table only */. 
1cd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
1cd80 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
1cd90 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
1cda0 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
1cdb0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1cdc0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
1cdd0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1cde0 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
1cdf0 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1ce00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ce10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1ce20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
1ce30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61   ){.      if( Ha
1ce40 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1ce50 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
1ce60 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
1ce70 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54         iCol = pT
1ce80 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
1ce90 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d     pCol = iCol>=
1cea0 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 ? &pTab->aCol[
1ceb0 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20  iCol] : 0;.     
1cec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ced0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
1cee0 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1cef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf00 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1cf10 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
1cf20 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
1cf30 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
1cf40 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
1cf50 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
1cf60 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
1cf70 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
1cf80 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
1cf90 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
1cfa0 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
1cfb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1cfc0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
1cfd0 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
1cfe0 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
1cff0 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
1d000 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
1d010 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
1d020 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
1d030 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
1d040 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
1d050 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
1d060 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
1d070 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
1d080 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
1d090 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
1d0a0 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
1d0b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
1d0c0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
1d0d0 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
1d0e0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
1d0f0 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
1d100 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
1d110 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73     zDataType = s
1d120 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
1d130 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43  (pCol,0);.    zC
1d140 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
1d150 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
1d160 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
1d170 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
1d180 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
1d190 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
1d1a0 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
1d1b0 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
1d1c0 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
1d1d0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
1d1e0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
1d1f0 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
1d200 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
1d210 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
1d220 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
1d230 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
1d240 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
1d250 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53  llSeq = sqlite3S
1d260 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65  trBINARY;.  }..e
1d270 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
1d280 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
1d290 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
1d2a0 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
1d2b0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
1d2c0 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
1d2d0 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
1d2e0 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
1d2f0 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
1d300 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
1d310 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
1d320 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
1d330 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
1d340 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
1d350 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
1d360 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
1d370 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
1d380 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
1d390 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
1d3a0 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
1d3b0 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
1d3c0 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
1d3d0 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
1d3e0 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
1d3f0 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
1d400 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
1d410 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
1d420 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
1d430 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
1d440 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
1d450 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
1d460 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d470 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1d480 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
1d490 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1d4a0 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
1d4b0 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
1d4c0 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
1d4d0 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
1d4e0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1d4f0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
1d500 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
1d510 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72  sg(db, rc, (zErr
1d520 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72  Msg?"%s":0), zEr
1d530 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1d540 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1d550 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  sg);.  rc = sqli
1d560 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1d570 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1d580 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1d590 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1d5a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  c;.}../*.** Slee
1d5b0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
1d5c0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
1d5d0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1d5e0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
1d5f0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
1d600 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
1d610 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
1d620 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
1d630 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d640 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
1d650 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1d660 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
1d670 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
1d680 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
1d690 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
1d6a0 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
1d6b0 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
1d6c0 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
1d6d0 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
1d6e0 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
1d6f0 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
1d700 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
1d710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
1d720 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
1d730 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
1d740 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
1d750 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1d760 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
1d770 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
1d780 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51  noff){.#ifdef SQ
1d790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1d7a0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1d7b0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1d7c0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1d7d0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1d7e0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1d7f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1d800 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
1d810 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
1d820 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
1d830 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
1d840 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1d850 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1d860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d870 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1d880 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
1d890 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
1d8a0 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
1d8b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
1d8c0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
1d8d0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1d8e0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
1d8f0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1d900 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d910 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72  ITE_ERROR;.  Btr
1d920 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66  ee *pBtree;..#if
1d930 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d940 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1d950 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1d960 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
1d970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1d980 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1d990 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d9a0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1d9b0 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c  ;.  pBtree = sql
1d9c0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1d9d0 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
1d9e0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1d9f0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1da00 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  r;.    sqlite3_f
1da10 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c  ile *fd;.    sql
1da20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1da30 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67  Btree);.    pPag
1da40 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
1da50 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
1da60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1da70 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20  er!=0 );.    fd 
1da80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
1da90 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
1daa0 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b  assert( fd!=0 );
1dab0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
1dac0 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
1dad0 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1dae0 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1daf0 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20  )pArg = fd;.    
1db00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1db10 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1db20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1db30 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  _VFS_POINTER ){.
1db40 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1db50 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  vfs**)pArg = sql
1db60 69 74 65 33 50 61 67 65 72 56 66 73 28 70 50 61  ite3PagerVfs(pPa
1db70 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1db80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1db90 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51  }else if( op==SQ
1dba0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e  LITE_FCNTL_JOURN
1dbb0 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  AL_POINTER ){.  
1dbc0 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
1dbd0 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  le**)pArg = sqli
1dbe0 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65  te3PagerJrnlFile
1dbf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1dc00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dc10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1dc20 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  ==SQLITE_FCNTL_D
1dc30 41 54 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20  ATA_VERSION ){. 
1dc40 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20       *(unsigned 
1dc50 69 6e 74 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  int*)pArg = sqli
1dc60 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73  te3PagerDataVers
1dc70 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
1dc80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1dc90 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1dca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dcb0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64  OsFileControl(fd
1dcc0 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20  , op, pArg);.   
1dcd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1dce0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1dcf0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1dd00 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1dd10 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1dd20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1dd30 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1dd40 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1dd50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1dd60 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1dd70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1dd80 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1dd90 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20  ITE_UNTESTABLE. 
1dda0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ddb0 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76  R(op);.#else.  v
1ddc0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
1ddd0 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
1dde0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
1ddf0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
1de00 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
1de10 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
1de20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1de30 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1de40 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
1de50 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1de60 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
1de70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1de80 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1de90 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
1dea0 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
1deb0 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
1dec0 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
1ded0 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
1dee0 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
1def0 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1df00 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
1df10 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
1df20 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
1df30 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
1df40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1df50 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
1df60 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1df70 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
1df80 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1df90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1dfa0 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
1dfb0 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
1dfc0 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
1dfd0 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
1dfe0 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
1dff0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1e000 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
1e010 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
1e020 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
1e030 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
1e040 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
1e050 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
1e060 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
1e070 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e080 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
1e090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1e0a0 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b  randomness(0,0);
1e0b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e0c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1e0d0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1e0e0 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
1e0f0 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
1e100 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
1e110 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
1e120 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
1e130 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
1e140 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
1e150 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
1e160 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
1e170 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
1e180 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
1e190 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
1e1a0 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
1e1b0 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
1e1c0 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
1e1d0 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
1e1e0 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
1e1f0 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
1e200 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
1e210 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1e220 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1e230 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e240 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
1e250 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
1e260 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
1e270 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
1e280 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
1e290 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
1e2a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e2b0 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1e2c0 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
1e2d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e2e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1e2f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e300 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41  trol(FAULT_INSTA
1e310 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20  LL, xCallback). 
1e320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72     **.    ** Arr
1e330 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  ange to invoke x
1e340 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65  Callback() whene
1e350 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ver sqlite3Fault
1e360 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  Sim() is called,
1e370 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c  .    ** if xCall
1e380 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  back is not NULL
1e390 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e3a0 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65  As a test of the
1e3b0 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72   fault simulator
1e3c0 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c   mechanism itsel
1e3d0 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  f, sqlite3FaultS
1e3e0 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20  im(0).    ** is 
1e3f0 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65  called immediate
1e400 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c  ly after install
1e410 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c  ing the new call
1e420 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74  back and the ret
1e430 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  urn.    ** value
1e440 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75   from sqlite3Fau
1e450 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73  ltSim(0) becomes
1e460 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
1e470 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
1e480 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a  test_control()..
1e490 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e4a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e4b0 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b  FAULT_INSTALL: {
1e4c0 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
1e4d0 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
1e4e0 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
1e4f0 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
1e500 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
1e510 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
1e520 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
1e530 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
1e540 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1e550 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1e560 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74  g(ap, int(*)(int
1e570 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
1e580 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a     typedef int(*
1e590 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1e5a0 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20  _t)(int);.      
1e5b0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1e5c0 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1e5d0 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54  k = va_arg(ap, T
1e5e0 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1e5f0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
1e600 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1e610 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e620 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1e630 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1e640 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
1e650 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
1e660 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
1e670 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
1e680 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
1e690 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
1e6a0 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
1e6b0 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
1e6c0 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
1e6d0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e6e0 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
1e6f0 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
1e700 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
1e710 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
1e720 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
1e730 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1e740 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
1e750 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1e760 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
1e770 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
1e780 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
1e790 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1e7a0 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
1e7b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1e7c0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1e7d0 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
1e7e0 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
1e7f0 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
1e800 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
1e810 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e820 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1e830 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1e840 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1e850 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
1e860 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
1e870 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1e880 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1e890 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
1e8a0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
1e8b0 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
1e8c0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
1e8d0 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
1e8e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
1e8f0 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
1e900 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
1e910 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
1e920 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1e930 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e940 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
1e950 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1e960 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
1e970 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
1e980 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
1e990 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
1e9a0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
1e9b0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
1e9c0 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
1e9d0 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
1e9e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1e9f0 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
1ea00 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
1ea10 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75     ** deleteriou
1ea20 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
1ea30 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ea40 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1ea50 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
1ea60 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
1ea70 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
1ea80 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
1ea90 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
1eaa0 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
1eab0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
1eac0 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
1ead0 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
1eae0 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
1eaf0 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
1eb00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1eb10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1eb20 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1eb30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1eb40 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1eb50 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
1eb60 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1eb70 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1eb80 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1eb90 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
1eba0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
1ebb0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
1ebc0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
1ebd0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
1ebe0 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
1ebf0 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
1ec00 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
1ec10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1ec20 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
1ec30 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
1ec40 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1ec50 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1ec60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1ec70 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
1ec80 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
1ec90 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1eca0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
1ecb0 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
1ecc0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
1ecd0 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
1ece0 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
1ecf0 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1ed00 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
1ed10 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
1ed20 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
1ed30 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ed40 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1ed50 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
1ed60 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
1ed70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a        assert( /*
1ed80 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a  side-effects-ok*
1ed90 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  / (x = va_arg(ap
1eda0 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
1edb0 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
1edc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
1edd0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ede0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1edf0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ee00 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
1ee10 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1ee20 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1ee30 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1ee40 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
1ee50 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
1ee60 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
1ee70 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
1ee80 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1ee90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1eea0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1eeb0 20 69 73 20 41 4c 57 41 59 53 28 58 29 20 69 66   is ALWAYS(X) if
1eec0 20 58 20 69 73 20 74 72 75 65 2c 20 6f 72 20 30   X is true, or 0
1eed0 20 69 66 20 58 20 69 73 20 66 61 6c 73 65 2e 0a   if X is false..
1eee0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1eef0 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
1ef00 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1ef10 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1ef20 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1ef30 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1ef40 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1ef50 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1ef60 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1ef70 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1ef80 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1ef90 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1efa0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1efb0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1efc0 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1efd0 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1efe0 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1eff0 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1f000 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1f010 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1f020 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1f030 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1f040 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1f050 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1f060 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1f070 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1f080 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1f090 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1f0a0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1f0b0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1f0c0 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1f0d0 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1f0e0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1f0f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f100 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1f110 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1f120 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1f130 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1f140 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1f150 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1f160 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1f170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f180 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1f190 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1f1a0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1f1b0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1f1c0 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1f1d0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1f1e0 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1f1f0 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1f200 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1f210 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1f220 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1f230 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1f240 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1f250 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1f260 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1f270 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1f280 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1f290 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1f2a0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1f2b0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1f2c0 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1f2d0 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1f2e0 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1f2f0 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1f300 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f310 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1f320 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1f330 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1f340 20 20 20 72 63 20 3d 20 78 20 3f 20 41 4c 57 41     rc = x ? ALWA
1f350 59 53 28 78 29 20 3a 20 30 3b 0a 20 20 20 20 20  YS(x) : 0;.     
1f360 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f370 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73     /*.    **   s
1f380 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f390 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f3a0 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a  TRL_BYTEORDER);.
1f3b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f3c0 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e  e integer return
1f3d0 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62  ed reveals the b
1f3e0 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65  yte-order of the
1f3f0 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69   computer on whi
1f400 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  ch.    ** SQLite
1f410 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20   is running:.   
1f420 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f430 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61   1     big-endia
1f440 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1f450 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20   at run-time.   
1f460 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20   **      10     
1f470 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
1f480 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
1f490 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33  -time.    **  43
1f4a0 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64  2101     big-end
1f4b0 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1f4c0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1f4d0 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31  me.    **  12341
1f4e0 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
1f4f0 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
1f500 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1f510 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65      */ .    case
1f520 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f530 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20  _BYTEORDER: {.  
1f540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f550 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20  BYTEORDER*100 + 
1f560 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44  SQLITE_LITTLEEND
1f570 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f  IAN*10 + SQLITE_
1f580 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20  BIGENDIAN;.     
1f590 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f5a0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1f5b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f5c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1f5d0 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64  ERVE, sqlite3 *d
1f5e0 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
1f5f0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1f600 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f  nReserve size to
1f610 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20   N for the main 
1f620 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20  database on the 
1f630 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1f640 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20  connection db.. 
1f650 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1f660 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1f670 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20  ESERVE: {.      
1f680 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1f690 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1f6a0 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  *);.      int x 
1f6b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1f6c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1f6d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1f6e0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  mutex);.      sq
1f6f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
1f700 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d  eSize(db->aDb[0]
1f710 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a  .pBt, 0, x, 0);.
1f720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1f730 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1f740 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
1f750 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f760 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1f770 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1f780 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1f790 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64  IONS, sqlite3 *d
1f7a0 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
1f7b0 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f  .    ** Enable o
1f7c0 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75  r disable variou
1f7d0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1f7e0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
1f7f0 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20  oses.  The .    
1f800 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73  ** argument N is
1f810 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
1f820 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62  timizations to b
1f830 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72  e disabled.  For
1f840 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f   normal.    ** o
1f850 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c  peration N shoul
1f860 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65  d be 0.  The ide
1f870 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74  a is that a test
1f880 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74   program (like t
1f890 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f  he.    ** SQL Lo
1f8a0 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20  gic Test or SLT 
1f8b0 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e  test module) can
1f8c0 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51   run the same SQ
1f8d0 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  L multiple times
1f8e0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72  .    ** with var
1f8f0 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
1f900 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76  ns disabled to v
1f910 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
1f920 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a  ame answer.    *
1f930 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  * is obtained in
1f940 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20   every case..   
1f950 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1f960 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
1f970 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20  IMIZATIONS: {.  
1f980 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1f990 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1f9a0 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
1f9b0 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28  ->dbOptFlags = (
1f9c0 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20  u16)(va_arg(ap, 
1f9d0 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a  int) & 0xffff);.
1f9e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f9f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1fa00 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1fa10 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1fa20 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1fa30 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
1fa40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1fa50 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
1fa60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e  is non-zero, con
1fa70 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70  figure the wrapp
1fa80 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a  ers so that all.
1fa90 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
1faa0 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c  t calls to local
1fab0 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61  time() and varia
1fac0 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f  nts fail. If ono
1fad0 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20  ff is zero,.    
1fae0 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  ** undo this set
1faf0 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1fb00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1fb10 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1fb20 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
1fb30 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1fb40 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
1fb50 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
1fb60 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1fb70 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1fb80 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1fb90 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1fba0 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1fbb0 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20  RRUPT, int);.   
1fbc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f   **.    ** Set o
1fbd0 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74  r clear a flag t
1fbe0 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
1fbf0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1fc00 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77  file is always w
1fc10 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  ell-.    ** form
1fc20 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72  ed and never cor
1fc30 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67  rupt.  This flag
1fc40 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66   is clear by def
1fc50 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67  ault, indicating
1fc60 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74   that.    ** dat
1fc70 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68  abase files migh
1fc80 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  t have arbitrary
1fc90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65   corruption.  Se
1fca0 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64  tting the flag d
1fcb0 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73  uring.    ** tes
1fcc0 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74  ting causes cert
1fcd0 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  ain assert() sta
1fce0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1fcf0 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61  ode to be activa
1fd00 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ted.    ** that 
1fd10 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72  demonstrat invar
1fd20 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f  iants on well-fo
1fd30 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
1fd40 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1fd50 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1fd60 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1fd70 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT: {.      sqli
1fd80 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fd90 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76  neverCorrupt = v
1fda0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1fdb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fdc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1fdd0 68 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20  he threshold at 
1fde0 77 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f  which OP_Once co
1fdf0 75 6e 74 65 72 73 20 72 65 73 65 74 20 62 61 63  unters reset bac
1fe00 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  k to zero..    *
1fe10 2a 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69  * By default thi
1fe20 73 20 69 73 20 30 78 37 66 66 66 66 66 66 65 20  s is 0x7ffffffe 
1fe30 28 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29  (over 2 billion)
1fe40 2c 20 62 75 74 20 74 68 61 74 20 76 61 6c 75 65  , but that value
1fe50 20 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62   is.    ** too b
1fe60 69 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20  ig to test in a 
1fe70 72 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e  reasonable amoun
1fe80 74 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68  t of time, so th
1fe90 69 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20  is control is.  
1fea0 20 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f    ** provided to
1feb0 20 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64   set a small and
1fec0 20 65 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c   easily reachabl
1fed0 65 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20  e reset value.. 
1fee0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1fef0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1ff00 4e 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48  NCE_RESET_THRESH
1ff10 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OLD: {.      sql
1ff20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ff30 2e 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73  .iOnceResetThres
1ff40 68 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70  hold = va_arg(ap
1ff50 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1ff60 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ff70 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1ff80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1ff90 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1ffa0 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61  OVERAGE, xCallba
1ffb0 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a  ck, ptr);.    **
1ffc0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1ffd0 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61  VDBE coverage ca
1ffe0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1fff0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74  to xCallback wit
20000 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  h context .    *
20010 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20  * pointer ptr.. 
20020 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
20030 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
20040 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  DBE_COVERAGE: {.
20050 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
20060 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
20070 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
20080 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  *branch_callback
20090 29 28 76 6f 69 64 2a 2c 75 6e 73 69 67 6e 65 64  )(void*,unsigned
200a0 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20   int,.          
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
200d0 67 6e 65 64 20 63 68 61 72 2c 75 6e 73 69 67 6e  gned char,unsign
200e0 65 64 20 63 68 61 72 29 3b 0a 20 20 20 20 20 20  ed char);.      
200f0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20100 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20  fig.xVdbeBranch 
20110 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e  = va_arg(ap,bran
20120 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ch_callback);.  
20130 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20140 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61  lConfig.pVdbeBra
20150 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28  nchArg = va_arg(
20160 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  ap,void*);.#endi
20170 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
20180 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
20190 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
201a0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
201b0 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c  TRL_SORTER_MMAP,
201c0 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20   db, nMax); */. 
201d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
201e0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
201f0 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  MAP: {.      sql
20200 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
20210 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
20220 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53  .      db->nMaxS
20230 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61  orterMmap = va_a
20240 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
20250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20260 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20270 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20280 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
20290 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20  SINIT);.    **. 
202a0 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c     ** Return SQL
202b0 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65  ITE_OK if SQLite
202c0 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61   has been initia
202d0 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45  lized and SQLITE
202e0 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a  _ERROR if.    **
202f0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
20300 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20310 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a  TCTRL_ISINIT: {.
20320 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20330 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
20340 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  Init==0 ) rc = S
20350 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
20360 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20370 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
20380 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20390 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
203a0 50 4f 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61  POSTER, db, dbNa
203b0 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29  me, onOff, tnum)
203c0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
203d0 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f  This test contro
203e0 6c 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  l is used to cre
203f0 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ate imposter tab
20400 6c 65 73 2e 20 20 22 64 62 22 20 69 73 20 61 20  les.  "db" is a 
20410 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74  pointer.    ** t
20420 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  o the database c
20430 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61  onnection.  dbNa
20440 6d 65 20 69 73 20 74 68 65 20 64 61 74 61 62 61  me is the databa
20450 73 65 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61  se name (ex: "ma
20460 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74  in" or.    ** "t
20470 65 6d 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c  emp") which will
20480 20 72 65 63 65 69 76 65 20 74 68 65 20 69 6d 70   receive the imp
20490 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20  oster.  "onOff" 
204a0 74 75 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d  turns imposter m
204b0 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72  ode on.    ** or
204c0 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73   off.  "tnum" is
204d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
204e0 66 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20  f the b-tree to 
204f0 77 68 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74  which the impost
20500 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
20510 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a  should connect..
20520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e      **.    ** En
20530 61 62 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f  able imposter mo
20540 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  de only when the
20550 20 73 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65   schema has alre
20560 61 64 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e  ady been parsed.
20570 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75    Then.    ** ru
20580 6e 20 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54  n a single CREAT
20590 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
205a0 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  t to construct t
205b0 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
205c0 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  e in.    ** the 
205d0 70 61 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20  parsed schema.  
205e0 54 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74  Then turn impost
205f0 65 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66  er mode back off
20600 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20   again..    **. 
20610 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d     ** If onOff==
20620 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65  0 and tnum>0 the
20630 6e 20 72 65 73 65 74 20 74 68 65 20 73 63 68 65  n reset the sche
20640 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ma for all datab
20650 61 73 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20  ases, causing.  
20660 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
20670 74 6f 20 62 65 20 72 65 70 61 72 73 65 64 20 74  to be reparsed t
20680 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
20690 69 73 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  is needed.  This
206a0 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
206b0 65 66 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e  effect of erasin
206c0 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74  g all imposter t
206d0 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ables..    */.  
206e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
206f0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a  STCTRL_IMPOSTER:
20700 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
20710 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
20720 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
20730 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
20740 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
20750 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
20760 74 2e 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46  t.iDb = sqlite3F
20770 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61  indDbName(db, va
20780 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68  _arg(ap,const ch
20790 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d  ar*));.      db-
207a0 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d  >init.busy = db-
207b0 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
207c0 62 6c 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ble = va_arg(ap,
207d0 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  int);.      db->
207e0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76  init.newTnum = v
207f0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
20800 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69       if( db->ini
20810 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d  t.busy==0 && db-
20820 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20  >init.newTnum>0 
20830 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20840 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
20850 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
20860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20870 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
20880 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
20890 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
208a0 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
208b0 28 59 59 43 4f 56 45 52 41 47 45 29 0a 20 20 20  (YYCOVERAGE).   
208c0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
208d0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
208e0 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52  _TESTCTRL_PARSER
208f0 5f 43 4f 56 45 52 41 47 45 2c 20 46 49 4c 45 20  _COVERAGE, FILE 
20900 2a 6f 75 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20  *out).    **.   
20910 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
20920 6e 74 72 6f 6c 20 28 6f 6e 6c 79 20 61 76 61 69  ntrol (only avai
20930 6c 61 62 6c 65 20 77 68 65 6e 20 53 51 4c 69 74  lable when SQLit
20940 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
20950 74 68 0a 20 20 20 20 2a 2a 20 2d 44 59 59 43 4f  th.    ** -DYYCO
20960 56 45 52 41 47 45 29 20 77 72 69 74 65 73 20 61  VERAGE) writes a
20970 20 72 65 70 6f 72 74 20 6f 6e 74 6f 20 22 6f 75   report onto "ou
20980 74 22 20 74 68 61 74 20 73 68 6f 77 73 20 61 6c  t" that shows al
20990 6c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 2f 6c  l.    ** state/l
209a0 6f 6f 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e 61  ookahead combina
209b0 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 61 72  tions in the par
209c0 73 65 72 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ser state machin
209d0 65 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 61  e.    ** which a
209e0 72 65 20 6e 65 76 65 72 20 65 78 65 72 63 69 73  re never exercis
209f0 65 64 2e 20 20 49 66 20 61 6e 79 20 73 74 61 74  ed.  If any stat
20a00 65 20 69 73 20 6d 69 73 73 65 64 2c 20 6d 61 6b  e is missed, mak
20a10 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  e the.    ** ret
20a20 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f  urn code SQLITE_
20a30 45 52 52 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20 20  ERROR..    */.  
20a40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
20a50 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f  STCTRL_PARSER_CO
20a60 56 45 52 41 47 45 3a 20 7b 0a 20 20 20 20 20 20  VERAGE: {.      
20a70 46 49 4c 45 20 2a 6f 75 74 20 3d 20 76 61 5f 61  FILE *out = va_a
20a80 72 67 28 61 70 2c 20 46 49 4c 45 2a 29 3b 0a 20  rg(ap, FILE*);. 
20a90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20aa0 50 61 72 73 65 72 43 6f 76 65 72 61 67 65 28 6f  ParserCoverage(o
20ab0 75 74 29 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ut) ) rc = SQLIT
20ac0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
20ad0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
20ae0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 59 59  if /* defined(YY
20af0 43 4f 56 45 52 41 47 45 29 20 2a 2f 0a 20 20 7d  COVERAGE) */.  }
20b00 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
20b10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20b20 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20  UNTESTABLE */.  
20b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20b40 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
20b50 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75  ility routine, u
20b60 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70  seful to VFS imp
20b70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68  lementations, th
20b80 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20  at checks.** to 
20b90 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73  see if a databas
20ba0 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49  e file was a URI
20bb0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20   that contained 
20bc0 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79  a specific query
20bd0 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20   .** parameter, 
20be0 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e  and if so obtain
20bf0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
20c00 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
20c10 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  er..**.** The zF
20c20 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
20c30 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
20c40 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
20c50 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29  into the xOpen()
20c60 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20  .** method of a 
20c70 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
20c80 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20  on.  The zParam 
20c90 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
20ca0 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71  name of the.** q
20cb0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77  uery parameter w
20cc0 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f  e seek.  This ro
20cd0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
20ce0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a  e value of the z
20cf0 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74  Param.** paramet
20d00 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  er if it exists.
20d10 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74    If the paramet
20d20 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  er does not exis
20d30 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  t, this routine.
20d40 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c  ** returns a NUL
20d50 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
20d60 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
20d70 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
20d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
20d90 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
20da0 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66  r *zParam){.  if
20db0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
20dc0 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65  | zParam==0 ) re
20dd0 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
20de0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
20df0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
20e00 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
20e10 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
20e20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
20e30 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
20e40 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
20e50 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
20e60 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
20e70 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
20e80 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
20e90 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
20ea0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
20eb0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
20ec0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
20ed0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20ee0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
20ef0 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
20f00 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
20f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
20f20 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
20f30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
20f40 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20f50 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
20f60 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
20f70 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
20f80 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
20f90 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
20fa0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
20fb0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
20fc0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
20fd0 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
20fe0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
20ff0 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
21000 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
21010 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
21020 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
21030 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
21040 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
21050 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
21060 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
21070 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
21080 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
21090 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
210a0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
210b0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
210c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
210d0 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
210e0 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
210f0 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
21100 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
21110 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
21120 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
21130 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
21140 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
21150 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
21160 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
21170 2c 20 26 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , &v)==0 ){.    
21180 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
21190 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
211a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
211b0 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
211c0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
211d0 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
211e0 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
211f0 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
21200 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
21210 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
21220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
21230 6d 65 29 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d  me){.  int iDb =
21240 20 7a 44 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74   zDbName ? sqlit
21250 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
21260 20 7a 44 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20   zDbName) : 0;. 
21270 20 72 65 74 75 72 6e 20 69 44 62 3c 30 20 3f 20   return iDb<0 ? 
21280 30 20 3a 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 : db->aDb[iDb]
21290 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .pBt;.}../*.** R
212a0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61  eturn the filena
212b0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
212c0 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
212d0 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  th a database.**
212e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
212f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
21300 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
21310 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
21320 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
21330 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
21340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21350 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
21360 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
21370 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
21380 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
21390 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
213a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
213b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20   }.#endif.  pBt 
213c0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
213d0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
213e0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
213f0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
21400 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
21410 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
21420 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
21430 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
21440 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
21450 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
21460 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
21470 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
21480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
21490 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
214a0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
214b0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
214c0 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
214d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
214e0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
214f0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
21500 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
21510 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
21520 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
21530 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
21540 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c  ndif.  pBt = sql
21550 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
21560 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
21570 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
21580 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
21590 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b  donly(pBt) : -1;
215a0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
215b0 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
215c0 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  T./*.** Obtain a
215d0 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65   snapshot handle
215e0 20 66 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f   for the snapsho
215f0 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44  t of database zD
21600 62 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  b currently .** 
21610 62 65 69 6e 67 20 72 65 61 64 20 62 79 20 68 61  being read by ha
21620 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
21630 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
21640 5f 67 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20  _get(.  sqlite3 
21650 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
21660 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74  ar *zDb,.  sqlit
21670 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70  e3_snapshot **pp
21680 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e  Snapshot.){.  in
21690 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
216a0 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
216b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69  ITE_OMIT_WAL..#i
216c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
216d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
216e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
216f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
21700 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21710 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
21720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
21730 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
21740 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69  db->mutex);..  i
21750 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
21760 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
21770 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
21780 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
21790 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
217a0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
217b0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
217c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
217d0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
217e0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
217f0 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
21800 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21810 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
21820 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
21830 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21860 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74  PagerSnapshotGet
21870 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
21880 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73  er(pBt), ppSnaps
21890 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
218a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
218b0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
218c0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
218d0 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
218e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
218f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21910 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
21920 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f  n on the snapsho
21930 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79 20  t idendified by 
21940 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e  pSnapshot..*/.in
21950 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
21960 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74  ot_open(.  sqlit
21970 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
21980 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73   char *zDb, .  s
21990 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
219a0 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  *pSnapshot.){.  
219b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
219c0 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
219d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
219e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
219f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
21a00 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
21a10 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
21a20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21a30 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
21a40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
21a50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
21a60 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
21a70 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
21a80 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it==0 ){.    int
21a90 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20   iDb;.    iDb = 
21aa0 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
21ab0 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  e(db, zDb);.    
21ac0 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
21ad0 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72  b>1 ){.      Btr
21ae0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
21af0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
21b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
21b10 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
21b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 50  ==0 ){.        P
21b30 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
21b40 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
21b50 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
21b60 6e 74 20 62 55 6e 6c 6f 63 6b 20 3d 20 30 3b 0a  nt bUnlock = 0;.
21b70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21b80 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
21b90 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
21ba0 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
21bb0 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29  nVdbeActive==0 )
21bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
21bd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21be0 6e 61 70 73 68 6f 74 43 68 65 63 6b 28 70 50 61  napshotCheck(pPa
21bf0 67 65 72 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b  ger, pSnapshot);
21c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21c10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21c20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21c30 62 55 6e 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  bUnlock = 1;.   
21c40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21c50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21c60 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  it(pBt);.       
21c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21c80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
21c90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21cc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21ce0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
21cf0 61 70 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65  apshotOpen(pPage
21d00 72 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  r, pSnapshot);. 
21d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21d40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21d50 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
21d60 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
21d70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e    sqlite3PagerSn
21d80 61 70 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65  apshotOpen(pPage
21d90 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 0);.        }
21da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 55 6e  .        if( bUn
21db0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
21dc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e    sqlite3PagerSn
21dd0 61 70 73 68 6f 74 55 6e 6c 6f 63 6b 28 70 50 61  apshotUnlock(pPa
21de0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
21df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21e00 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
21e10 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
21e20 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
21e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
21e40 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65  .}../*.** Recove
21e60 72 20 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68  r as many snapsh
21e70 6f 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ots as possible 
21e80 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c  from the wal fil
21e90 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
21ea0 68 0a 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20  h.** schema zDb 
21eb0 6f 66 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a  of database db..
21ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
21ed0 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28  napshot_recover(
21ee0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
21ef0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
21f00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21f10 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44  _ERROR;.  int iD
21f20 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
21f30 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64  E_OMIT_WAL..#ifd
21f40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21f50 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
21f60 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
21f70 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
21f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f90 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
21fa0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
21fb0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
21fc0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62  b->mutex);.  iDb
21fd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
21fe0 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
21ff0 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
22000 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65  Db>1 ){.    Btre
22010 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
22020 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
22030 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
22040 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
22050 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
22060 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
22070 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
22080 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
220a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
220b0 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
220c0 6f 74 52 65 63 6f 76 65 72 28 73 71 6c 69 74 65  otRecover(sqlite
220d0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
220e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
220f0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
22100 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
22110 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
22120 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
22130 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
22140 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22150 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
22160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
22170 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  e a snapshot han
22180 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  dle obtained fro
22190 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  m sqlite3_snapsh
221a0 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69  ot_get()..*/.voi
221b0 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  d sqlite3_snapsh
221c0 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f  ot_free(sqlite3_
221d0 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
221e0 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  hot){.  sqlite3_
221f0 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b  free(pSnapshot);
22200 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
22210 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
22220 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  HOT */..#ifndef 
22230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
22240 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
22250 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
22260 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c  name of a compil
22270 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72  e-time option, r
22280 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
22290 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73  at option.** was
222a0 20 75 73 65 64 20 61 6e 64 20 66 61 6c 73 65 20   used and false 
222b0 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  if not..**.** Th
222c0 65 20 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f  e name can optio
222d0 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68  nally begin with
222e0 20 22 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74   "SQLITE_" but t
222f0 68 65 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65  he "SQLITE_" pre
22300 66 69 78 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  fix.** is not re
22310 71 75 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74  quired for a mat
22320 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ch..*/.int sqlit
22330 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  e3_compileoption
22340 5f 75 73 65 64 28 63 6f 6e 73 74 20 63 68 61 72  _used(const char
22350 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69   *zOptName){.  i
22360 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e  nt i, n;.  int n
22370 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Opt;.  const cha
22380 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  r **azCompileOpt
22390 3b 0a 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  ;. .#if SQLITE_E
223a0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
223b0 20 20 69 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d    if( zOptName==
223c0 30 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  0 ){.    (void)S
223d0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
223e0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
223f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
22400 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71  zCompileOpt = sq
22410 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69  lite3CompileOpti
22420 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69  ons(&nOpt);..  i
22430 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
22440 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51  mp(zOptName, "SQ
22450 4c 49 54 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20  LITE_", 7)==0 ) 
22460 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20  zOptName += 7;. 
22470 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
22480 65 6e 33 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a  en30(zOptName);.
22490 0a 20 20 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74  .  /* Since nOpt
224a0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20   is normally in 
224b0 73 69 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 61  single digits, a
224c0 20 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20 69   linear search i
224d0 73 20 0a 20 20 2a 2a 20 61 64 65 71 75 61 74 65  s .  ** adequate
224e0 2e 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  . No need for a 
224f0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 2a  binary search. *
22500 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
22510 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Opt; i++){.    i
22520 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
22530 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43  mp(zOptName, azC
22540 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29  ompileOpt[i], n)
22550 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
22560 74 65 33 49 73 49 64 43 68 61 72 28 28 75 6e 73  te3IsIdChar((uns
22570 69 67 6e 65 64 20 63 68 61 72 29 61 7a 43 6f 6d  igned char)azCom
22580 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d  pileOpt[i][n])==
22590 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
225a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
225b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
225c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
225d0 68 65 20 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d  he N-th compile-
225e0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 73 74 72 69  time option stri
225f0 6e 67 2e 20 20 49 66 20 4e 20 69 73 20 6f 75 74  ng.  If N is out
22600 20 6f 66 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65   of range,.** re
22610 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  turn a NULL poin
22620 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ter..*/.const ch
22630 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ar *sqlite3_comp
22640 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e  ileoption_get(in
22650 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74  t N){.  int nOpt
22660 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
22670 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20  *azCompileOpt;. 
22680 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20   azCompileOpt = 
22690 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70  sqlite3CompileOp
226a0 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20  tions(&nOpt);.  
226b0 69 66 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f  if( N>=0 && N<nO
226c0 70 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pt ){.    return
226d0 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d   azCompileOpt[N]
226e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
226f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
22700 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
22710 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
22720 0a                                               .