/ Hex Artifact Content
Login

Artifact 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 28 73 71 6c 69 74 65 33 5f 69  c( sz*(sqlite3_i
63e0: 6e 74 36 34 29 63 6e 74 20 29 3b 20 20 2f 2a 20  nt64)cnt );  /* 
63f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6400: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6410: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6420: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6430: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6440: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6450: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6460: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6470: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6480: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6490: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
64a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
64b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
64c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
64d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
64f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
6500: 54 72 75 65 20 3d 20 28 75 31 36 29 73 7a 3b 0a  True = (u16)sz;.
6510: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
6520: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c      int i;.    L
6530: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b  ookasideSlot *p;
6540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20  .    assert( sz 
6550: 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  > (int)sizeof(Lo
6560: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b  okasideSlot*) );
6570: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6580: 64 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a  de.nSlot = cnt;.
6590: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
65a0: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
65b0: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
65c0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
65d0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
65e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69  ->lookaside.pIni
65f0: 74 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  t;.      db->loo
6600: 6b 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70  kaside.pInit = p
6610: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
6620: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
6630: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
6640: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6650: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
6660: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6670: 44 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  Disable = 0;.   
6680: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6690: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
66a0: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
66b0: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
66c0: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b  ide.pStart = db;
66d0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
66e0: 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20  de.pEnd = db;.  
66f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6700: 62 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  bDisable = 1;.  
6710: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6720: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  sz = 0;.    db->
6730: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
6740: 63 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ced = 0;.    db-
6750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6760: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
6770: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6780: 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72  LOOKASIDE */.  r
6790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
67b0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
67c0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
67d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
67e0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
67f0: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
6800: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
6810: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
6820: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
6830: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
6840: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
6850: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
6860: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
6870: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
6880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
6890: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
68a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70  }../*.** Free up
68b0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
68c0: 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74  as we can from t
68d0: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
68e0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
68f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6900: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
6910: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
6920: 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
6930: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
6940: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
6950: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6960: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
6970: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
6980: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
6990: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
69a0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
69b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
69c0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
69d0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
69e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
69f0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6a00: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6a10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  pBt ){.      Pag
6a20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
6a30: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
6a40: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
6a50: 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50  e3PagerShrink(pP
6a60: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
6a70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6a80: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73  eaveAll(db);.  s
6a90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6aa0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6ac0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  K;.}../*.** Flus
6ad0: 68 20 61 6e 79 20 64 69 72 74 79 20 70 61 67 65  h any dirty page
6ae0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63  s in the pager-c
6af0: 61 63 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74  ache for any att
6b00: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a  ached database.*
6b10: 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  * to disk..*/.in
6b20: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63  t sqlite3_db_cac
6b30: 68 65 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20  heflush(sqlite3 
6b40: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
6b50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6b60: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e  _OK;.  int bSeen
6b70: 42 75 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65  Busy = 0;..#ifde
6b80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6b90: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
6ba0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
6bb0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
6bc0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6bd0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
6be0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6bf0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6c00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
6c10: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
6c20: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
6c30: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
6c40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
6c50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6c60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
6c70: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6c80: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
6c90: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  Bt) ){.      Pag
6ca0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
6cb0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
6cc0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
6cd0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
6ce0: 68 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  h(pPager);.     
6cf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6d00: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
6d10: 62 53 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20  bSeenBusy = 1;. 
6d20: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6d30: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
6d40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6d50: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
6d60: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
6d70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6d80: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
6d90: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ((rc==SQLITE_OK 
6da0: 26 26 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20  && bSeenBusy) ? 
6db0: 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
6dc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  );.}../*.** Conf
6dd0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e  iguration settin
6de0: 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69  gs for an indivi
6df0: 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  dual database co
6e00: 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20  nnection.*/.int 
6e10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
6e20: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  g(sqlite3 *db, i
6e30: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
6e50: 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   rc;.  va_start(
6e60: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
6e70: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
6e80: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6e90: 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a  G_MAINDBNAME: {.
6ea0: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
6eb0: 30 36 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20  06824-28531 */. 
6ec0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
6ed0: 36 32 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20  6257-52125 */.  
6ee0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a      db->aDb[0].z
6ef0: 44 62 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67  DbSName = va_arg
6f00: 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20  (ap,char*);.    
6f10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6f20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6f30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
6f40: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f  LITE_DBCONFIG_LO
6f50: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
6f60: 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61   void *pBuf = va
6f70: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
6f80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35   /* IMP: R-26835
6f90: 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20  -10964 */.      
6fa0: 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
6fb0: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20  ap, int);       
6fc0: 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d  /* IMP: R-47871-
6fd0: 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69  25994 */.      i
6fe0: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
6ff0: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f  ap, int);      /
7000: 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35  * IMP: R-04460-5
7010: 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63  3386 */.      rc
7020: 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64   = setupLookasid
7030: 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20  e(db, pBuf, sz, 
7040: 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  cnt);.      brea
7050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7060: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
7070: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
7080: 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t {.        int 
7090: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op;      /* The 
70a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
70b0: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f    u32 mask;    /
70c0: 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69  * Mask of the bi
70d0: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61  t in sqlite3.fla
70e0: 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20  gs to set/clear 
70f0: 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67  */.      } aFlag
7100: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
7110: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7120: 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20  IG_ENABLE_FKEY, 
7130: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7140: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20  _ForeignKeys    
7150: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
7160: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
7170: 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20  BLE_TRIGGER,    
7180: 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c      SQLITE_Enabl
7190: 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20  eTrigger  },.   
71a0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
71b0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 56 49  CONFIG_ENABLE_VI
71c0: 45 57 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EW,           SQ
71d0: 4c 49 54 45 5f 45 6e 61 62 6c 65 56 69 65 77 20  LITE_EnableView 
71e0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
71f0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7200: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
7210: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
7220: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
7230: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7240: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7250: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
7260: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
7270: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
7280: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
7290: 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f  NFIG_NO_CKPT_ON_
72a0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49  CLOSE,      SQLI
72b0: 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65  TE_NoCkptOnClose
72c0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
72d0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
72e0: 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20 20  NABLE_QPSG,     
72f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61        SQLITE_Ena
7300: 62 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a 20  bleQPSG     },. 
7310: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7320: 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
7330: 5f 45 51 50 2c 20 20 20 20 20 20 20 20 20 20 20  _EQP,           
7340: 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51  SQLITE_TriggerEQ
7350: 50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  P     },.       
7360: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7370: 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53  IG_RESET_DATABAS
7380: 45 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,        SQLITE
7390: 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 20 20  _ResetDatabase  
73a0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
73b0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 45 46  ITE_DBCONFIG_DEF
73c0: 45 4e 53 49 56 45 2c 20 20 20 20 20 20 20 20 20  ENSIVE,         
73d0: 20 20 20 20 53 51 4c 49 54 45 5f 44 65 66 65 6e      SQLITE_Defen
73e0: 73 69 76 65 20 20 20 20 20 20 7d 2c 0a 20 20 20  sive      },.   
73f0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7400: 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
7410: 53 43 48 45 4d 41 2c 20 20 20 20 20 20 20 53 51  SCHEMA,       SQ
7420: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
7430: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 53 51 4c 49 54 45 5f 4e 6f 53 63 68 65     SQLITE_NoSche
7470: 6d 61 45 72 72 6f 72 20 20 7d 2c 0a 20 20 20 20  maError  },.    
7480: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
7490: 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54  ONFIG_LEGACY_ALT
74a0: 45 52 5f 54 41 42 4c 45 2c 20 20 20 20 53 51 4c  ER_TABLE,    SQL
74b0: 49 54 45 5f 4c 65 67 61 63 79 41 6c 74 65 72 20  ITE_LegacyAlter 
74c0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
74d0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
74e0: 44 51 53 5f 44 44 4c 2c 20 20 20 20 20 20 20 20  DQS_DDL,        
74f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 71         SQLITE_Dq
7500: 73 44 44 4c 20 20 20 20 20 20 20 20 20 7d 2c 0a  sDDL         },.
7510: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7520: 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 4d  _DBCONFIG_DQS_DM
7530: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
7540: 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 20 20   SQLITE_DqsDML  
7550: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
7560: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7570: 46 49 47 5f 4c 45 47 41 43 59 5f 46 49 4c 45 5f  FIG_LEGACY_FILE_
7580: 46 4f 52 4d 41 54 2c 20 20 20 20 53 51 4c 49 54  FORMAT,    SQLIT
7590: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 20  E_LegacyFileFmt 
75a0: 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   },.      };.   
75b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
75c0: 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  i;.      rc = SQ
75d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49  LITE_ERROR; /* I
75e0: 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37  MP: R-42790-2337
75f0: 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  2 */.      for(i
7600: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
7610: 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a  aFlagOp); i++){.
7620: 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61          if( aFla
7630: 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b  gOp[i].op==op ){
7640: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
7650: 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70  noff = va_arg(ap
7660: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
7670: 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61    int *pRes = va
7680: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
7690: 20 20 20 20 20 20 20 20 20 20 75 36 34 20 6f 6c            u64 ol
76a0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
76b0: 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  gs;.          if
76c0: 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20  ( onoff>0 ){.   
76d0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
76e0: 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d  gs |= aFlagOp[i]
76f0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7700: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66   }else if( onoff
7710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7720: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
7730: 7e 28 75 36 34 29 61 46 6c 61 67 4f 70 5b 69 5d  ~(u64)aFlagOp[i]
7740: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7760: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
7770: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
7780: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
7790: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
77a0: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
77b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
77c0: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
77d0: 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
77e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61  = (db->flags & a
77f0: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21  FlagOp[i].mask)!
7800: 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  =0;.          }.
7810: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
7820: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
7830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7840: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7860: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
7870: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
7890: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
78a0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
78b0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
78c0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
78d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73   available..*/.s
78e0: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c  tatic int binCol
78f0: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
7900: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
7910: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7920: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7930: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7940: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
7950: 72 63 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f  rc, n;.  UNUSED_
7960: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7970: 64 29 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c  d);.  n = nKey1<
7980: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
7990: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
79a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
79b0: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
79c0: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
79d0: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
79e0: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
79f0: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
7a00: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
7a10: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
7a20: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
7a30: 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rary. */.  asser
7a40: 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79  t( pKey1 && pKey
7a50: 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  2 );.  rc = memc
7a60: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
7a70: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
7a80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
7a90: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
7aa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7ac0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
7ad0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 52 54 52 49  tion named "RTRI
7ae0: 4d 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  M" which is alwa
7af0: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
7b00: 20 20 49 67 6e 6f 72 65 20 74 72 61 69 6c 69 6e    Ignore trailin
7b10: 67 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  g spaces..*/.sta
7b20: 74 69 63 20 69 6e 74 20 72 74 72 69 6d 43 6f 6c  tic int rtrimCol
7b30: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  lFunc(.  void *p
7b40: 55 73 65 72 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  User,.  int nKey
7b50: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7b60: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7b70: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7b80: 4b 65 79 32 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  Key2.){.  const 
7b90: 75 38 20 2a 70 4b 31 20 3d 20 28 63 6f 6e 73 74  u8 *pK1 = (const
7ba0: 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f   u8*)pKey1;.  co
7bb0: 6e 73 74 20 75 38 20 2a 70 4b 32 20 3d 20 28 63  nst u8 *pK2 = (c
7bc0: 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 32 3b 0a  onst u8*)pKey2;.
7bd0: 20 20 77 68 69 6c 65 28 20 6e 4b 65 79 31 20 26    while( nKey1 &
7be0: 26 20 70 4b 31 5b 6e 4b 65 79 31 2d 31 5d 3d 3d  & pK1[nKey1-1]==
7bf0: 27 20 27 20 29 20 6e 4b 65 79 31 2d 2d 3b 0a 20  ' ' ) nKey1--;. 
7c00: 20 77 68 69 6c 65 28 20 6e 4b 65 79 32 20 26 26   while( nKey2 &&
7c10: 20 70 4b 32 5b 6e 4b 65 79 32 2d 31 5d 3d 3d 27   pK2[nKey2-1]=='
7c20: 20 27 20 29 20 6e 4b 65 79 32 2d 2d 3b 0a 20 20   ' ) nKey2--;.  
7c30: 72 65 74 75 72 6e 20 62 69 6e 43 6f 6c 6c 46 75  return binCollFu
7c40: 6e 63 28 70 55 73 65 72 2c 20 6e 4b 65 79 31 2c  nc(pUser, nKey1,
7c50: 20 70 4b 65 79 31 2c 20 6e 4b 65 79 32 2c 20 70   pKey1, nKey2, p
7c60: 4b 65 79 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Key2);.}../*.** 
7c70: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
7c80: 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65  ollSeq is the de
7c90: 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42  fault built-in B
7ca0: 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71  INARY..*/.int sq
7cb0: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f  lite3IsBinary(co
7cc0: 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b  nst CollSeq *p){
7cd0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7ce0: 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43  || p->xCmp!=binC
7cf0: 6f 6c 6c 46 75 6e 63 20 7c 7c 20 73 74 72 63 6d  ollFunc || strcm
7d00: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e 41  p(p->zName,"BINA
7d10: 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  RY")==0 );.  ret
7d20: 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78  urn p==0 || p->x
7d30: 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63  Cmp==binCollFunc
7d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7d50: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7d60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7d70: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7d80: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7d90: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7da0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7db0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7dc0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7dd0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7de0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7df0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7e00: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7e10: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7e20: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7e30: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7e40: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7e50: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7e60: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7e70: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7e80: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7e90: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7ea0: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7eb0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7ec0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7ed0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7ee0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7ef0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7f00: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7f10: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7f30: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7f40: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7f50: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7f60: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7f70: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7f80: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7f90: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7fa0: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7fb0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7fc0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7fd0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7fe0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7ff0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
8000: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
8010: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
8020: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8030: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
8040: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8050: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
8060: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
8070: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8090: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
80a0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
80b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
80c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
80d0: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
80e0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
80f0: 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  id() API functio
8100: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8110: 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65  e3_set_last_inse
8120: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
8130: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *db, sqlite3_in
8140: 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66  t64 iRowid){.#if
8150: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8160: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
8170: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8180: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
8190: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
81a0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
81b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
81c0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
81d0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
81e0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74  tex);.  db->last
81f0: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
8200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8210: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8230: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8240: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
8250: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
8260: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
8270: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
8280: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
8290: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
82a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
82b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
82c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
82d0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
82e0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
82f0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8300: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8310: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
8320: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
8330: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8340: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
8350: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
8360: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
8370: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8380: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
8390: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
83a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
83b0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
83c0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
83d0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
83e0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
83f0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8410: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8420: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
8430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8440: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
8450: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
8460: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
8470: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
8480: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
8490: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
84a0: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
84b0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
84c0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
84d0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
84e0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
84f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
8500: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
8510: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
8520: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
8530: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
8540: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
8550: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
8560: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
8570: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
8580: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8590: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
85a0: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
85b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
85c0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
85d0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
85e0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
85f0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8600: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
8610: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
8620: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
8630: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
8640: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
8650: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
8660: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
8670: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
8680: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
8690: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
86a0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
86b0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
86c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
86d0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
86e0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
86f0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
8700: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
8710: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
8720: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
8730: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
8740: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
8750: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
8760: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
8770: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8780: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8790: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
87a0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
87b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
87c0: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
87d0: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
87e0: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
87f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8800: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8810: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8820: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
8830: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
8840: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
8850: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
8860: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
8870: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
8880: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
8890: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
88a0: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
88b0: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
88c0: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
88d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
88e0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
88f0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8900: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
8910: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
8920: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8930: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8940: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8950: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8960: 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  a;.    if( pSche
8970: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ma ){.      for(
8980: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
8990: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
89a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
89b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
89c0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
89d0: 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71  ab = (Table *)sq
89e0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
89f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
8a00: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73  irtual(pTab) ) s
8a10: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
8a20: 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a  nect(db, pTab);.
8a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8a40: 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65  }.  for(p=sqlite
8a50: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8a60: 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71  Module); p; p=sq
8a70: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
8a80: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
8a90: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
8aa0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
8ab0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
8ac0: 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20  pEpoTab ){.     
8ad0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8ae0: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d  onnect(db, pMod-
8af0: 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d  >pEpoTab);.    }
8b00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
8b10: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
8b20: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
8b30: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
8b40: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
8b50: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
8b60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
8b70: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
8b80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
8b90: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
8ba0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
8bb0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8bc0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
8bd0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
8be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
8bf0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8c00: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8c10: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
8c20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8c30: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
8c40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
8c50: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
8c60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
8c70: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
8c80: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8c90: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
8ca0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
8cb0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
8cc0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
8cd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8cf0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
8d00: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
8d10: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8d20: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
8d30: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
8d40: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
8d50: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
8d60: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
8d70: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
8d80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
8d90: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
8da0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
8db0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
8dc0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
8dd0: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
8de0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8df0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
8e00: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
8e10: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
8e20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e30: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
8e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8e50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8e60: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
8e70: 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54  ->mTrace & SQLIT
8e80: 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b  E_TRACE_CLOSE ){
8e90: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
8ea0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8eb0: 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72  SE, db->pTraceAr
8ec0: 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a  g, db, 0);.  }..
8ed0: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
8ee0: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
8ef0: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
8f00: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
8f10: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
8f20: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
8f30: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
8f40: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
8f50: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
8f60: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
8f70: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
8f80: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
8f90: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
8fa0: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
8fb0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
8fc0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
8fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
8fe0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
8ff0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
9000: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
9010: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
9020: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
9030: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
9040: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
9050: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
9060: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
9070: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
9080: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
9090: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
90a0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
90b0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
90c0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
90d0: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
90e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
90f0: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
9100: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
9110: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
9120: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
9130: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
9140: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
9150: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
9160: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
9170: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
9180: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
9190: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
91a0: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
91b0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
91c0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
91d0: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
91e0: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
91f0: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
9200: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9210: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
9220: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
9230: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
9240: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
9250: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
9260: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
9270: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
9280: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
9290: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
92a0: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
92b0: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
92c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
92d0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
92e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
92f0: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
9300: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
9310: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
9320: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9330: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
9340: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
9350: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
9360: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9370: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
9380: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
9390: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
93a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
93b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
93c0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
93d0: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
93e0: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
93f0: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
9400: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
9410: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
9420: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
9430: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
9440: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
9450: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
9460: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
9470: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
9480: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
9490: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
94a0: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
94b0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
94c0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
94d0: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
94e0: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
94f0: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
9500: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
9510: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
9520: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
9530: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
9540: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
9550: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
9560: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9570: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
9580: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
9590: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
95a0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
95b0: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
95c0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
95d0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
95e0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
95f0: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
9600: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
9610: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
9620: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
9630: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
9640: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9650: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
9660: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
9670: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
9680: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
9690: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
96a0: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
96b0: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
96c0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
96d0: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
96e0: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
96f0: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
9700: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
9710: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
9720: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9730: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9740: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
9750: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
9760: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
9770: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
9790: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
97a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
97b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
97c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
97d0: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
97e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
97f0: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
9800: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
9810: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
9820: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
9830: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
9840: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
9850: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
9860: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
9870: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
9880: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
9890: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
98a0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
98b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
98c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
98d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
98e0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
98f0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
9900: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
9910: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9920: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
9930: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
9940: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
9950: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
9960: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
9970: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
9980: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
9990: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
99a0: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
99b0: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
99c0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
99d0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
99e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
99f0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
9a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
9a10: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
9a20: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
9a30: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
9a40: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
9a50: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
9a60: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
9a70: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
9a80: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
9a90: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
9aa0: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
9ab0: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
9ac0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
9ad0: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
9ae0: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
9af0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
9b00: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9b10: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
9b20: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
9b30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
9b40: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
9b50: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
9b60: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
9b70: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
9b80: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
9b90: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
9ba0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
9bb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
9bc0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
9bd0: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
9be0: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
9bf0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
9c00: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
9c10: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
9c20: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
9c30: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
9c40: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
9c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c60: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
9c70: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
9c80: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
9c90: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
9ca0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
9cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
9cc0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
9cd0: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
9ce0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
9cf0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
9d00: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
9d10: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
9d20: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
9d30: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
9d40: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
9d50: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
9d60: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
9d70: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
9d80: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
9d90: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
9da0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
9db0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
9dc0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
9dd0: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
9de0: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
9df0: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
9e00: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
9e10: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
9e20: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
9e30: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
9e40: 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
9e50: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9e60: 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Func); i; i=sqli
9e70: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9e80: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65      FuncDef *pNe
9e90: 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xt, *p;.    p = 
9ea0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9eb0: 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
9ec0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
9ed0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9ee0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
9ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9f00: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
9f10: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
9f20: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
9f30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9f40: 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63  Clear(&db->aFunc
9f50: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
9f60: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9f70: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
9f80: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9f90: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
9fa0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
9fb0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
9fc0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
9fd0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
9fe0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
9ff0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
a000: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
a010: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
a020: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
a030: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
a040: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
a050: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
a060: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
a070: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a090: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
a0a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
a0b0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
a0c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a0d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a0e0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
a0f0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
a100: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
a110: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
a120: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
a130: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
a140: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
a150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  );.    sqlite3Vt
a160: 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65  abEponymousTable
a170: 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b  Clear(db, pMod);
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
a190: 4d 6f 64 75 6c 65 55 6e 72 65 66 28 64 62 2c 20  ModuleUnref(db, 
a1a0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
a1b0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
a1c0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
a1d0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
a1e0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
a1f0: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
a200: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
a210: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
a220: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a230: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
a240: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
a250: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
a260: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
a270: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
a280: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
a290: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
a2a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a2b0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
a2c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
a2d0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
a2e0: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
a2f0: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
a300: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
a310: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
a320: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
a330: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
a340: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
a350: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
a360: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
a370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
a380: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
a390: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
a3a0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
a3b0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
a3c0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
a3d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
a3e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a3f0: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
a400: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
a410: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
a420: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
a430: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a440: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
a450: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
a460: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a470: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
a480: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a490: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
a4a0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a4b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
a4c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f  sert( sqlite3Loo
a4d0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
a4e0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
a4f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
a500: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
a510: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
a520: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
a530: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a540: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
a550: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
a560: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
a570: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
a580: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
a590: 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63  n.** any write c
a5a0: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
a5b0: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
a5c0: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
a5d0: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
a5e0: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
a5f0: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
a600: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
a610: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
a620: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
a630: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20  se that cursor. 
a640: 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65   Read cursors re
a650: 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61  main open and va
a660: 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22  lid.** but are "
a670: 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74  saved" in case t
a680: 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61  he table pages a
a690: 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e  re moved around.
a6a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a6b0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
a6c0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
a6d0: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
a6e0: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
a6f0: 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61   0;.  int schema
a700: 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
a710: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a720: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
a730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
a740: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a750: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c  ..  /* Obtain al
a760: 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  l b-tree mutexes
a770: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61   before making a
a780: 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65  ny calls to Btre
a790: 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20  eRollback(). .  
a7a0: 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  ** This is impor
a7b0: 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65  tant in case the
a7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
a7d0: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68  ng rolled back h
a7e0: 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  as.  ** modified
a7f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
a800: 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74  hema. If the b-t
a810: 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20  ree mutexes are 
a820: 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68  not taken.  ** h
a830: 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65  ere, then anothe
a840: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
a850: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20  onnection might 
a860: 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e  sneak in between
a870: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
a880: 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  se rollback and 
a890: 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68  schema reset, wh
a8a0: 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61  ich can cause fa
a8b0: 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74  lse.  ** corrupt
a8c0: 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73  ion reports in s
a8d0: 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20  ome cases.  */. 
a8e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
a8f0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68  erAll(db);.  sch
a900: 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d  emaChange = (db-
a910: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
a920: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29  AG_SchemaChange)
a930: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
a940: 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28  busy==0;..  for(
a950: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a960: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
a970: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
a980: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
a990: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a9a0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
a9b0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
a9c0: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
a9d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a9e0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
a9f0: 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63  p, tripCode, !sc
aa00: 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20  hemaChange);.   
aa10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
aa20: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
aa30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
aa40: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
aa50: 20 69 66 28 20 73 63 68 65 6d 61 43 68 61 6e 67   if( schemaChang
aa60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
aa70: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
aa80: 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b  atements(db, 0);
aa90: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
aaa0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
aab0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
aac0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
aad0: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
aae0: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
aaf0: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
ab00: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
ab10: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
ab20: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
ab30: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
ab40: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
ab50: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
ab60: 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54  s &= ~(u64)SQLIT
ab70: 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f  E_DeferFKs;..  /
ab80: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
ab90: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
aba0: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
abb0: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
abc0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
abd0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
abe0: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
abf0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
ac00: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
ac10: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
ac20: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
ac30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
ac40: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
ac50: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
ac60: 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  e name correspon
ac70: 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f  ding to the erro
ac80: 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66  r code.** specif
ac90: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
aca0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ent..*/.#if defi
acb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f  ned(SQLITE_NEED_
acc0: 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20  ERR_NAME).const 
acd0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
ace0: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
acf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ad00: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
ad10: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
ad20: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
ad30: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
ad40: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
ad50: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
ad60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
ad70: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
ad80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad90: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
ada0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
adb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adc0: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
add0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ade0: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
adf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae10: 5f 45 52 52 4f 52 5f 53 4e 41 50 53 48 4f 54 3a  _ERROR_SNAPSHOT:
ae20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae30: 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50 53  LITE_ERROR_SNAPS
ae40: 48 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  HOT";    break;.
ae50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae60: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
ae70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae80: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
ae90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aea0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aeb0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
aec0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aed0: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
aee0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
aef0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af00: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
af10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
af20: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
af30: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
af40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af50: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
af60: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
af70: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
af80: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
af90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
afa0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
afb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
afc0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
afe0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aff0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
b000: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
b010: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
b020: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
b030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b040: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
b050: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
b060: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
b070: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
b080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b090: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b0b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
b0c0: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
b0d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b0e0: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
b0f0: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
b100: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
b110: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
b120: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b130: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
b140: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
b150: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
b160: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
b170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b180: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
b190: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
b1a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b1b0: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
b1c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b1d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
b1e0: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
b1f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b200: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
b210: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
b220: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
b230: 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3a  ADONLY_CANTINIT:
b240: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b250: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
b260: 4e 49 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NIT"; break;.   
b270: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
b280: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
b290: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b2a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
b2b0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
b2c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b2d0: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
b2e0: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b2f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
b300: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
b310: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b320: 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
b330: 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ORY: zName = "SQ
b340: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49  LITE_READONLY_DI
b350: 52 45 43 54 4f 52 59 22 3b 62 72 65 61 6b 3b 0a  RECTORY";break;.
b360: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b370: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
b380: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b390: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
b3a0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
b3b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3c0: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
b3d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b400: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b410: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
b420: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b430: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
b440: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
b450: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b460: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
b470: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
b480: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b490: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
b4a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
b4c0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b4d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b4e0: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
b4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b500: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
b510: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
b520: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b530: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
b540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b550: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b560: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
b570: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b580: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
b590: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
b5b0: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
b5c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b5d0: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
b5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b5f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b600: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
b610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b620: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
b630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b640: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b650: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
b660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b670: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
b680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b690: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b6a0: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
b6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b6c0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
b6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b6f0: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
b700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b710: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
b720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b740: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
b750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b760: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
b770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b790: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
b7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b7b0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
b7c0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b7e0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b7f0: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b820: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b830: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b840: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b850: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b860: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
b870: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b880: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
b890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b8a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b8b0: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
b8c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b8d0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
b8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b8f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b900: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
b910: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b920: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b930: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b940: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b950: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b960: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b970: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b980: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b990: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9a0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b9b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b9c0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b9d0: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b9e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b9f0: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
ba00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba10: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
ba20: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
ba30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ba40: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
ba50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
ba70: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
ba80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba90: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
baa0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
bac0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
bad0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bae0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
baf0: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
bb00: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
bb10: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
bb20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb30: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
bb40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
bb60: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
bb70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
bb90: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
bba0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
bbb0: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
bbc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
bbe0: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
bbf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
bc00: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
bc10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
bc50: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
bc60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc70: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
bc80: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
bc90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
bca0: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
bcb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcc0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
bcd0: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
bce0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bcf0: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
bd00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd10: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
bd40: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
bd50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
bd70: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
bd80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd90: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
bda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bdb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
bdc0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
bdd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bde0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
bdf0: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
be00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
be10: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
be20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
be30: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
be40: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
be50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
be60: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
be70: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
be80: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
be90: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
bea0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
beb0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
bec0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
bed0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
bee0: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
bef0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf00: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
bf10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bf20: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
bf30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bf40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bf50: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
bf60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bf70: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
bf80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bf90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bfa0: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
bfb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bfc0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
bfd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bfe0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bff0: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
c000: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c010: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
c020: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c030: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c040: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
c050: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c060: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c070: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
c080: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c090: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c0a0: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
c0b0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c0c0: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
c0d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c0e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c0f0: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
c100: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c110: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
c120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c130: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c140: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c170: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c180: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
c190: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
c1a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c1b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
c1c0: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
c1d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c1e0: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
c1f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c200: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
c210: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c240: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c250: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
c260: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c270: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c280: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
c290: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c2a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
c2b0: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
c2c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c2d0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c2e0: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c310: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c320: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
c330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c340: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c350: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
c360: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c370: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
c380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c390: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c3a0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c3d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c3e0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
c3f0: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
c400: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c410: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
c420: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
c430: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c440: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
c450: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c460: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
c470: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c480: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
c490: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c4a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c4b0: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
c4c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c4d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c4f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c500: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
c510: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c520: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c540: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c550: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
c560: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c570: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c5a0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
c5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c5c0: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
c5d0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
c5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c5f0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
c600: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c610: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
c620: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
c630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c640: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
c650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
c670: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
c680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c690: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c6b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
c6c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c6e0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
c6f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c700: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c710: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
c720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c730: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c740: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
c750: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c760: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c770: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
c780: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c790: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
c7a0: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c7d0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c7e0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
c7f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c800: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
c810: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c820: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
c830: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
c840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c850: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c860: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
c870: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c880: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
c890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c8a0: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c8c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
c8d0: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
c8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c8f0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
c900: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
c910: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
c920: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c930: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
c940: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
c950: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
c960: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
c970: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
c980: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
c990: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c9a0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
c9b0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
c9c0: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
c9d0: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
c9e0: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
c9f0: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
ca00: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
ca10: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
ca20: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
ca30: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
ca40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
ca50: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
ca60: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
ca70: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
ca80: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
ca90: 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  gic error",.    
caa0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
cab0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
cac0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
cad0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
cae0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
caf0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cb00: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
cb10: 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65 64  / "query aborted
cb20: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cb30: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
cb40: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
cb50: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
cb60: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
cb70: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
cb80: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
cb90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
cba0: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
cbb0: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
cbc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
cbd0: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
cbe0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
cbf0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
cc00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cc10: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
cc20: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
cc30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
cc40: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
cc50: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
cc60: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
cc70: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
cc80: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
cc90: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
cca0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
ccb0: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
ccc0: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
ccd0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
cce0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
ccf0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
cd00: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
cd10: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
cd20: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
cd30: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
cd40: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
cd50: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
cd60: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
cd70: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
cd80: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
cd90: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
cda0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
cdb0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
cdc0: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
cdd0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cde0: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
cdf0: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
ce00: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
ce10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ce20: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
ce30: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
ce40: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
ce50: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
ce60: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
ce70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
ce80: 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64 20  SE      */ "bad 
ce90: 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74 68  parameter or oth
cea0: 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c 0a  er API misuse",.
ceb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
cec0: 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f 2a  SABLE_LFS.    /*
ced0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
cee0: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
cef0: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
cf00: 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a 20  sabled",.#else. 
cf10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
cf20: 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 23  FS       */ 0,.#
cf30: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51 4c  endif.    /* SQL
cf40: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
cf50: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
cf60: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
cf70: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
cf80: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
cf90: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
cfa0: 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e 20       */ "column 
cfb0: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
cfc0: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
cfd0: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
cfe0: 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  / "file is not a
cff0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
d000: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  /* SQLITE_NOTICE
d010: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 69 66 69        */ "notifi
d020: 63 61 74 69 6f 6e 20 6d 65 73 73 61 67 65 22 2c  cation message",
d030: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 57  .    /* SQLITE_W
d040: 41 52 4e 49 4e 47 20 20 20 20 20 2a 2f 20 22 77  ARNING     */ "w
d050: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 22 2c  arning message",
d060: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
d070: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
d080: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
d090: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
d0a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
d0b0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
d0c0: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
d0d0: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
d0e0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
d0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d100: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 7b 0a 20 20  SQLITE_ROW: {.  
d110: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 6e 6f 74      zErr = "anot
d120: 68 65 72 20 72 6f 77 20 61 76 61 69 6c 61 62 6c  her row availabl
d130: 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e";.      break;
d140: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d150: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 7b 0a 20  SQLITE_DONE: {. 
d160: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6e 6f 20       zErr = "no 
d170: 6d 6f 72 65 20 72 6f 77 73 20 61 76 61 69 6c 61  more rows availa
d180: 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ble";.      brea
d190: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
d1a0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
d1b0: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
d1c0: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
d1d0: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
d1e0: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
d1f0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
d200: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
d210: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
d220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d230: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
d240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d250: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
d260: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
d270: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
d280: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
d290: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
d2a0: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
d2b0: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
d2c0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
d2d0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
d2e0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
d2f0: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
d300: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
d310: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
d320: 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72 65 74 72 79  on-zero to retry
d330: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 52 65 74 75   the lock.  Retu
d340: 72 6e 20 7a 65 72 6f 20 74 6f 20 73 74 6f 70 20  rn zero to stop 
d350: 74 72 79 69 6e 67 0a 2a 2a 20 61 6e 64 20 63 61  trying.** and ca
d360: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 72 65  use SQLite to re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d390: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
d3a0: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  yCallback(.  voi
d3b0: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
d3c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d3d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d3e0: 20 20 69 6e 74 20 63 6f 75 6e 74 2c 20 20 20 20    int count,    
d3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d400: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61  mber of times ta
d410: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73  ble has been bus
d420: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  y */.  sqlite3_f
d430: 69 6c 65 20 2a 70 46 69 6c 65 20 20 20 20 20 20  ile *pFile      
d440: 2f 2a 20 54 68 65 20 66 69 6c 65 20 6f 6e 20 77  /* The file on w
d450: 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 6f 63  hich the lock oc
d460: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  curred */.){.#if
d470: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
d480: 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  | HAVE_USLEEP.  
d490: 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
d4a0: 66 6f 72 20 73 79 73 74 65 6d 73 20 74 68 61 74  for systems that
d4b0: 20 68 61 76 65 20 73 75 70 70 6f 72 74 20 66 6f   have support fo
d4c0: 72 20 73 6c 65 65 70 69 6e 67 20 66 6f 72 20 66  r sleeping for f
d4d0: 72 61 63 74 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a  ractions of.  **
d4e0: 20 61 20 73 65 63 6f 6e 64 2e 20 20 45 78 61 6d   a second.  Exam
d4f0: 70 6c 65 73 3a 20 20 41 6c 6c 20 77 69 6e 64 6f  ples:  All windo
d500: 77 73 20 73 79 73 74 65 6d 73 2c 20 75 6e 69 78  ws systems, unix
d510: 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 75 73   systems with us
d520: 6c 65 65 70 28 29 20 2a 2f 0a 20 20 73 74 61 74  leep() */.  stat
d530: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
d540: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
d550: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
d560: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
d570: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
d580: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d590: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
d5a0: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
d5b0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
d5c0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
d5d0: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
d5e0: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
d5f0: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
d600: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
d610: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
d620: 74 6d 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  tmout = db->busy
d630: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
d640: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 23 69  elay, prior;..#i
d650: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d660: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
d670: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
d680: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
d690: 65 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e,SQLITE_FCNTL_L
d6a0: 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 26 74 6d 6f  OCK_TIMEOUT,&tmo
d6b0: 75 74 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ut)==SQLITE_OK )
d6c0: 7b 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74 20  {.    if( count 
d6d0: 29 7b 0a 20 20 20 20 20 20 74 6d 6f 75 74 20 3d  ){.      tmout =
d6e0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d6f0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
d700: 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
d710: 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  TL_LOCK_TIMEOUT,
d720: 20 26 74 6d 6f 75 74 29 3b 0a 20 20 20 20 20 20   &tmout);.      
d730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
d740: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d750: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  n 1;.    }.  }.#
d760: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d770: 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a  RAMETER(pFile);.
d780: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
d790: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
d7a0: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
d7b0: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
d7c0: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
d7d0: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
d7e0: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
d7f0: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
d800: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
d810: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
d820: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
d830: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
d840: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
d850: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
d860: 61 79 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20  ay > tmout ){.  
d870: 20 20 64 65 6c 61 79 20 3d 20 74 6d 6f 75 74 20    delay = tmout 
d880: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
d890: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
d8a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
d8b0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
d8c0: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
d8d0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
d8e0: 6c 73 65 0a 20 20 2f 2a 20 54 68 69 73 20 63 61  lse.  /* This ca
d8f0: 73 65 20 66 6f 72 20 75 6e 69 78 20 73 79 73 74  se for unix syst
d900: 65 6d 73 20 74 68 61 74 20 6c 61 63 6b 20 75 73  ems that lack us
d910: 6c 65 65 70 28 29 20 73 75 70 70 6f 72 74 2e 20  leep() support. 
d920: 20 53 6c 65 65 70 69 6e 67 0a 20 20 2a 2a 20 6d   Sleeping.  ** m
d930: 75 73 74 20 62 65 20 64 6f 6e 65 20 69 6e 20 69  ust be done in i
d940: 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20 77 68 6f  ncrements of who
d950: 6c 65 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  le seconds */.  
d960: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
d970: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
d980: 69 6e 74 20 74 6d 6f 75 74 20 3d 20 28 28 73 71  int tmout = ((sq
d990: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
d9a0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 55 4e 55  syTimeout;.  UNU
d9b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46  SED_PARAMETER(pF
d9c0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 28 63 6f 75  ile);.  if( (cou
d9d0: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 6d 6f  nt+1)*1000 > tmo
d9e0: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
d9f0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
da00: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
da10: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
da20: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
da30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
da40: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
da50: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
da60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
da70: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
da80: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 74 6f  ration failed to
da90: 20 61 63 71 75 69 72 65 20 61 0a 2a 2a 20 6c 6f   acquire a.** lo
daa0: 63 6b 20 6f 6e 20 56 46 53 20 66 69 6c 65 20 70  ck on VFS file p
dab0: 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  File..**.** If t
dac0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
dad0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
dae0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
daf0: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
db00: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
db10: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
db20: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
db30: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
db40: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
db50: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
db60: 6c 65 72 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ler *p, sqlite3_
db70: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
db80: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 2d  int rc;.  if( p-
db90: 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3d 3d 30  >xBusyHandler==0
dba0: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
dbb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
dbc0: 20 70 2d 3e 62 45 78 74 72 61 46 69 6c 65 41 72   p->bExtraFileAr
dbd0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  g ){.    /* Add 
dbe0: 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  an extra paramet
dbf0: 65 72 20 77 69 74 68 20 74 68 65 20 70 46 69 6c  er with the pFil
dc00: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
dc10: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
dc20: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  ** callback argu
dc30: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
dc40: 20 69 6e 74 20 28 2a 78 54 72 61 29 28 76 6f 69   int (*xTra)(voi
dc50: 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66  d*,int,sqlite3_f
dc60: 69 6c 65 2a 29 3b 0a 20 20 20 20 78 54 72 61 20  ile*);.    xTra 
dc70: 3d 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c  = (int(*)(void*,
dc80: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  int,sqlite3_file
dc90: 2a 29 29 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c  *))p->xBusyHandl
dca0: 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 78 54 72  er;.    rc = xTr
dcb0: 61 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70  a(p->pBusyArg, p
dcc0: 2d 3e 6e 42 75 73 79 2c 20 70 46 69 6c 65 29 3b  ->nBusy, pFile);
dcd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
dce0: 20 4c 65 67 61 63 79 20 73 74 79 6c 65 20 62 75   Legacy style bu
dcf0: 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy handler callb
dd00: 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ack */.    rc = 
dd10: 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  p->xBusyHandler(
dd20: 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 2d 3e  p->pBusyArg, p->
dd30: 6e 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  nBusy);.  }.  if
dd40: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
dd50: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
dd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
dd70: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
dd80: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
dd90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
dda0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
ddb0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
ddc0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
ddd0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
dde0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
ddf0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
de00: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
de10: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
de20: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
de30: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
de40: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
de50: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
de60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
de70: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
de80: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
de90: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
dea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
deb0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
dec0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ded0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
dee0: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
def0: 6e 64 6c 65 72 2e 78 42 75 73 79 48 61 6e 64 6c  ndler.xBusyHandl
df00: 65 72 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62  er = xBusy;.  db
df10: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 42  ->busyHandler.pB
df20: 75 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  usyArg = pArg;. 
df30: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
df40: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
df50: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45  ->busyHandler.bE
df60: 78 74 72 61 46 69 6c 65 41 72 67 20 3d 20 30 3b  xtraFileArg = 0;
df70: 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  .  db->busyTimeo
df80: 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ut = 0;.  sqlite
df90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
dfa0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
dfb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dfc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dfd0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
dfe0: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
dff0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
e000: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
e010: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
e020: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
e030: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
e040: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
e050: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
e060: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
e070: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
e080: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
e090: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
e0a0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
e0b0: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
e0c0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
e0d0: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
e0e0: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
e0f0: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
e100: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
e110: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e120: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e130: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e140: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e150: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e160: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e170: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
e180: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
e190: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e1a0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
e1b0: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
e1c0: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
e1d0: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
e1e0: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e  rogressOps = (un
e1f0: 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20  signed)nOps;.   
e200: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e210: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
e220: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
e230: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
e240: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
e250: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
e260: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
e270: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
e280: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e290: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
e2a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e2b0: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
e2c0: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
e2d0: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
e2e0: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
e2f0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
e300: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
e310: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
e320: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
e330: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
e340: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23   *db, int ms){.#
e350: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e360: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e370: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e380: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
e390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e3a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
e3b0: 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  f.  if( ms>0 ){.
e3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
e3d0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 28 69 6e  _handler(db, (in
e3e0: 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  t(*)(void*,int))
e3f0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
e400: 79 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20 20  yCallback,.     
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 64          (void*)d
e430: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
e440: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
e450: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
e460: 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67 20  r.bExtraFileArg 
e470: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
e480: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
e490: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
e4a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e4b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e4c0: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
e4d0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
e4e0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
e4f0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
e500: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
e510: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
e520: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
e530: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e540: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e550: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e560: 68 65 63 6b 4f 6b 28 64 62 29 20 26 26 20 28 64  heckOk(db) && (d
e570: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 67 69  b==0 || db->magi
e580: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
e590: 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20 20 20 28  ZOMBIE) ){.    (
e5a0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e5b0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e5c0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e5d0: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
e5e0: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
e5f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e600: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
e610: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
e620: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e630: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
e640: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
e650: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
e660: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
e670: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
e680: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
e690: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
e6a0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
e6b0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
e6c0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
e6d0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
e6e0: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
e6f0: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
e700: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
e710: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
e720: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e730: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
e740: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
e750: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e760: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
e770: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e780: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e790: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e7a0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e7b0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e7c0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e7d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e7e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e7f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e800: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56  t*),.  void (*xV
e810: 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  alue)(sqlite3_co
e820: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
e830: 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69  (*xInverse)(sqli
e840: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e850: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e860: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
e870: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
e880: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
e890: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
e8a0: 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73    int extraFlags
e8b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
e8c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e8d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
e8e0: 61 73 73 65 72 74 28 20 78 56 61 6c 75 65 3d 3d  assert( xValue==
e8f0: 30 20 7c 7c 20 78 53 46 75 6e 63 3d 3d 30 20 29  0 || xSFunc==0 )
e900: 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f  ;.  if( zFunctio
e910: 6e 4e 61 6d 65 3d 3d 30 20 20 20 20 20 20 20 20  nName==0        
e920: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
e930: 68 61 76 65 20 61 20 76 61 6c 69 64 20 6e 61 6d  have a valid nam
e940: 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 78 53 46 75  e */.   || (xSFu
e950: 6e 63 21 3d 30 20 26 26 20 78 46 69 6e 61 6c 21  nc!=0 && xFinal!
e960: 3d 30 29 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  =0)        /* No
e970: 74 20 62 6f 74 68 20 78 53 46 75 6e 63 20 61 6e  t both xSFunc an
e980: 64 20 78 46 69 6e 61 6c 20 2a 2f 0a 20 20 20 7c  d xFinal */.   |
e990: 7c 20 28 28 78 46 69 6e 61 6c 3d 3d 30 29 21 3d  | ((xFinal==0)!=
e9a0: 28 78 53 74 65 70 3d 3d 30 29 29 20 20 20 20 20  (xStep==0))     
e9b0: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
e9c0: 74 68 65 72 20 6f 66 20 78 46 69 6e 61 6c 20 61  ther of xFinal a
e9d0: 6e 64 20 78 53 74 65 70 20 2a 2f 0a 20 20 20 7c  nd xStep */.   |
e9e0: 7c 20 28 28 78 56 61 6c 75 65 3d 3d 30 29 21 3d  | ((xValue==0)!=
e9f0: 28 78 49 6e 76 65 72 73 65 3d 3d 30 29 29 20 20  (xInverse==0))  
ea00: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
ea10: 74 68 65 72 20 6f 66 20 78 56 61 6c 75 65 2c 20  ther of xValue, 
ea20: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 20 7c  xInverse */.   |
ea30: 7c 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41  | (nArg<-1 || nA
ea40: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
ea50: 4e 43 54 49 4f 4e 5f 41 52 47 29 0a 20 20 20 7c  NCTION_ARG).   |
ea60: 7c 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20  | (255<(nName = 
ea70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ea80: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
ea90: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
eaa0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
eab0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
eac0: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
ead0: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
eae0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
eaf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
eb00: 49 54 45 5f 46 55 4e 43 5f 44 49 52 45 43 54 3d  ITE_FUNC_DIRECT=
eb10: 3d 53 51 4c 49 54 45 5f 44 49 52 45 43 54 4f 4e  =SQLITE_DIRECTON
eb20: 4c 59 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61  LY );.  extraFla
eb30: 67 73 20 3d 20 65 6e 63 20 26 20 20 28 53 51 4c  gs = enc &  (SQL
eb40: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
eb50: 43 7c 53 51 4c 49 54 45 5f 44 49 52 45 43 54 4f  C|SQLITE_DIRECTO
eb60: 4e 4c 59 7c 53 51 4c 49 54 45 5f 53 55 42 54 59  NLY|SQLITE_SUBTY
eb70: 50 45 29 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53  PE);.  enc &= (S
eb80: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
eb90: 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a  SK|SQLITE_ANY);.
eba0: 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54    .#ifndef SQLIT
ebb0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
ebc0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
ebd0: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
ebe0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
ebf0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
ec00: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
ec10: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
ec20: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
ec30: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
ec40: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
ec50: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
ec60: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
ec70: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
ec80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53  ..  **.  ** If S
ec90: 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65  QLITE_ANY is spe
eca0: 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65  cified, add thre
ecb0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
ecc0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  e function.  ** 
ecd0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
ece0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e  e..  */.  if( en
ecf0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  c==SQLITE_UTF16 
ed00: 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c  ){.    enc = SQL
ed10: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
ed20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63  .  }else if( enc
ed30: 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a  ==SQLITE_ANY ){.
ed40: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
ed50: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
ed60: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
ed70: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
ed80: 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72  SQLITE_UTF8|extr
ed90: 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  aFlags,.        
eda0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
edb0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
edc0: 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  l, xValue, xInve
edd0: 72 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f 72  rse, pDestructor
ede0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
edf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ee00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
ee10: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
ee20: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
ee30: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
ee40: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
ee50: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
ee60: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
ee70: 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c   xFinal, xValue,
ee80: 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74   xInverse, pDest
ee90: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
eea0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
eeb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
eec0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
eed0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
eee0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
eef0: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
ef00: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
ef10: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
ef20: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
ef30: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
ef40: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
ef50: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
ef60: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
ef70: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
ef80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ef90: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
efa0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
efb0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
efc0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
efd0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
efe0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
eff0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
f000: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
f010: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
f020: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
f030: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
f040: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
f050: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
f060: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
f070: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
f080: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
f090: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
f0a0: 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20 26  ASK)==(u32)enc &
f0b0: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
f0c0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
f0d0: 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
f0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f0f0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
f100: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
f110: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
f120: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
f130: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
f140: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
f150: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
f160: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
f170: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
f180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f190: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f1a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
f1b0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
f1c0: 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d  ts(db, 0);.    }
f1d0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
f1e0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
f1f0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
f200: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
f210: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
f220: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
f230: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
f240: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f250: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
f260: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
f270: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
f280: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
f290: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
f2a0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
f2b0: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
f2c0: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
f2d0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
f2e0: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
f2f0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
f300: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
f310: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
f320: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
f330: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70  ++;.  }.  p->u.p
f340: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65  Destructor = pDe
f350: 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66  structor;.  p->f
f360: 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66  uncFlags = (p->f
f370: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
f380: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20  E_FUNC_ENCMASK) 
f390: 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20  | extraFlags;.  
f3a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e  testcase( p->fun
f3b0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
f3c0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
f3d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
f3e0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f3f0: 54 45 5f 44 49 52 45 43 54 4f 4e 4c 59 20 29 3b  TE_DIRECTONLY );
f400: 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78  .  p->xSFunc = x
f410: 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a  SFunc ? xSFunc :
f420: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
f430: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
f440: 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20 78  .  p->xValue = x
f450: 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e 76  Value;.  p->xInv
f460: 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73 65 3b  erse = xInverse;
f470: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
f480: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
f490: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
f4a0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
f4b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f4c0: 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   Worker function
f4d0: 20 75 73 65 64 20 62 79 20 75 74 66 2d 38 20 41   used by utf-8 A
f4e0: 50 49 73 20 74 68 61 74 20 63 72 65 61 74 65 20  PIs that create 
f4f0: 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  new functions:.*
f500: 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  *.**    sqlite3_
f510: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
f520: 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ).**    sqlite3_
f530: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
f540: 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74  v2().**    sqlit
f550: 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77  e3_create_window
f560: 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a 73  _function().*/.s
f570: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
f580: 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20 73  FunctionApi(.  s
f590: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
f5a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
f5b0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
f5c0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
f5d0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
f5e0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
f5f0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f600: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
f610: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
f620: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f630: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
f640: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f650: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f660: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
f670: 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
f680: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
f690: 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c   (*xInverse)(sql
f6a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f6b0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f6c0: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 73  *),.  void(*xDes
f6d0: 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  troy)(void*).){.
f6e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f6f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
f700: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
f710: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
f720: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f730: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f740: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f750: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f760: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f770: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
f780: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f790: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f7a0: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
f7b0: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
f7c0: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
f7d0: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
f7e0: 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74  (sizeof(FuncDest
f7f0: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
f800: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
f810: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f820: 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73  (db);.      xDes
f830: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
f840: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
f850: 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20     pArg->nRef = 
f860: 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65  0;.    pArg->xDe
f870: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
f880: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
f890: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
f8a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
f8b0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
f8c0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
f8d0: 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63 2c 20   .      xSFunc, 
f8e0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78  xStep, xFinal, x
f8f0: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c  Value, xInverse,
f900: 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69 66 28   pArg.  );.  if(
f910: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e   pArg && pArg->n
f920: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
f930: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
f940: 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74  _OK );.    xDest
f950: 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  roy(p);.    sqli
f960: 74 65 33 5f 66 72 65 65 28 70 41 72 67 29 3b 0a  te3_free(pArg);.
f970: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
f980: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
f990: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
f9a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f9b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f9c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f9d0: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
f9e0: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
f9f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
fa00: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
fa10: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
fa20: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
fa30: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
fa40: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
fa50: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
fa60: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
fa70: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fa80: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
fa90: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
faa0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fab0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fac0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
fad0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
fae0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
faf0: 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f  rn createFunctio
fb00: 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20  nApi(db, zFunc, 
fb10: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53  nArg, enc, p, xS
fb20: 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20  Func, xStep,.   
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 30   xFinal, 0, 0, 0
fb60: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
fb70: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
fb80: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
fb90: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
fba0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
fbb0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
fbc0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
fbd0: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
fbe0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fbf0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fc00: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
fc10: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
fc20: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fc30: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
fc40: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
fc50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
fc60: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
fc70: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
fc80: 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e  return createFun
fc90: 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75  ctionApi(db, zFu
fca0: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
fcb0: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
fcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20       xFinal, 0, 
fcf0: 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a  0, xDestroy);.}.
fd00: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
fd10: 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69  te_window_functi
fd20: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
fd30: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
fd40: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
fd50: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
fd60: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
fd70: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
fd80: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
fd90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
fda0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
fdb0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
fdc0: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
fdd0: 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
fde0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
fdf0: 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c   (*xInverse)(sql
fe00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fe10: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fe20: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  **),.  void (*xD
fe30: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
fe40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61  ){.  return crea
fe50: 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62  teFunctionApi(db
fe60: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
fe70: 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65 70 2c  nc, p, 0, xStep,
fe80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78 56 61       xFinal, xVa
feb0: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 78  lue, xInverse, x
fec0: 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69 66  Destroy);.}..#if
fed0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fee0: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
fef0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
ff00: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
ff10: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
ff20: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
ff30: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
ff40: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
ff50: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
ff60: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
ff70: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
ff80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
ff90: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
ffa0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ffb0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
ffc0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
ffd0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
ffe0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
fff0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
10000 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20  zFunc8;..#ifdef 
10010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10020 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10030 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10040 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63  kOk(db) || zFunc
10050 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65  tionName==0 ) re
10060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10070 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
10080 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10090 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
100a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
100b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
100c0 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
100d0 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
100e0 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
100f0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
10100 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
10110 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
10120 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
10130 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
10140 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69  xSFunc,xStep,xFi
10150 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73 71  nal,0,0,0);.  sq
10160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10170 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
10180 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
10190 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
101a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
101b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
101c0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
101d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
101e0 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70  owing is the imp
101f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
10200 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  n SQL function t
10210 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61  hat always.** fa
10220 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ils with an erro
10230 72 20 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e  r message statin
10240 67 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  g that the funct
10250 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74  ion is used in t
10260 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74  he.** wrong cont
10270 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ext.  The sqlite
10280 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
10290 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20  ion() API might 
102a0 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c  construct.** SQL
102b0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75   function that u
102c0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
102d0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
102e0 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74  tions will exist
102f0 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  .** for name res
10300 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20  olution but are 
10310 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61  actually overloa
10320 64 65 64 20 62 79 20 74 68 65 20 78 46 69 6e 64  ded by the xFind
10330 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68  Function.** meth
10340 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  od of virtual ta
10350 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
10360 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61  void sqlite3Inva
10370 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  lidFunction(.  s
10380 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
10390 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65  context,  /* The
103a0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e   function callin
103b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
103c0 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  nt NotUsed,     
103d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
103e0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
103f0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
10400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
10410 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20  lue **NotUsed2  
10420 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63   /* Value of eac
10430 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
10440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10450 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
10460 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  ar*)sqlite3_user
10470 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
10480 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
10490 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
104a0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
104b0 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73  ed2);.  zErr = s
104c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
104d0 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
104e0 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73   use function %s
104f0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
10500 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d  d context", zNam
10510 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  e);.  sqlite3_re
10520 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
10530 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20  xt, zErr, -1);. 
10540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
10550 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  rr);.}../*.** De
10560 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
10570 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
10580 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
10590 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
105a0 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
105b0 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
105c0 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
105d0 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
105e0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
105f0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
10600 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
10610 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
10620 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
10630 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
10640 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
10650 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
10660 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
10670 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
10680 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
10690 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
106a0 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
106b0 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
106c0 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
106d0 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
106e0 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
106f0 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
10700 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
10710 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
10720 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
10730 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
10740 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10750 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
10760 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
10770 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
10780 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
10790 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Arg.){.  int rc;
107a0 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a  .  char *zCopy;.
107b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
107c0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
107d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
107e0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
107f0 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e  || zName==0 || n
10800 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65  Arg<-2 ){.    re
10810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10820 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
10830 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10840 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10850 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  tex);.  rc = sql
10860 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
10870 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
10880 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
10890 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )!=0;.  sqlite3_
108a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
108b0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63  mutex);.  if( rc
108c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
108d0 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73  _OK;.  zCopy = s
108e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a  qlite3_mprintf(z
108f0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
10900 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  py==0 ) return S
10910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
10920 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
10930 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
10940 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
10950 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c            zCopy,
10980 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
10990 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73  unction, 0, 0, s
109a0 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
109b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
109c0 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
109d0 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
109e0 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
109f0 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
10a00 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
10a10 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73  ered trace.** is
10a20 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
10a30 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20  ** A NULL trace 
10a40 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
10a50 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69  hat no tracing i
10a60 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
10a70 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65  on-NULL.** trace
10a80 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
10a90 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
10aa0 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
10ab0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
10ac0 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  .** SQL statemen
10ad0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
10ae0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10af0 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ATED.void *sqlit
10b00 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
10b10 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61   *db, void(*xTra
10b20 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
10b30 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
10b40 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
10b50 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
10b60 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10b70 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10b80 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10b90 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
10ba0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10bb0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
10bc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10bd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10be0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10bf0 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
10c00 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72  ceArg;.  db->mTr
10c10 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53  ace = xTrace ? S
10c20 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41  QLITE_TRACE_LEGA
10c30 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54  CY : 0;.  db->xT
10c40 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75  race = (int(*)(u
10c50 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  32,void*,void*,v
10c60 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20  oid*))xTrace;.  
10c70 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
10c80 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10c90 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10ca0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10cb0 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
10cc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
10cd0 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a  EPRECATED */../*
10ce0 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
10cf0 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  e callback using
10d00 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69   the version-2 i
10d10 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
10d20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
10d30 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
10d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f  /* Trace this co
10d70 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  nnection */.  un
10d80 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20  signed mTrace,  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10db0 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65   of events to be
10dc0 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74   traced */.  int
10dd0 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e  (*xTrace)(unsign
10de0 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  ed,void*,void*,v
10df0 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62  oid*),  /* Callb
10e00 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f  ack to invoke */
10e10 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e40 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23   Context */.){.#
10e50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e60 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10e70 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10e80 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10e90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ea0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10eb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
10ec0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10ed0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
10ee0 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78  f( mTrace==0 ) x
10ef0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28  Trace = 0;.  if(
10f00 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72   xTrace==0 ) mTr
10f10 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d  ace = 0;.  db->m
10f20 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a  Trace = mTrace;.
10f30 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
10f40 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
10f50 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
10f60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10f70 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10f80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10f90 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
10fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10fb0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67  ECATED./*.** Reg
10fc0 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
10fd0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
10fe0 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
10ff0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
11000 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
11010 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
11020 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
11030 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
11040 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
11050 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
11060 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
11070 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
11080 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
11090 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
110a0 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
110b0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
110c0 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
110d0 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
110e0 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
110f0 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
11100 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
11110 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
11120 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
11130 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
11140 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
11150 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
11160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11170 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
11180 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11190 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
111a0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
111b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
111c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
111d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
111e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
111f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
11200 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
11210 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
11220 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
11230 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
11240 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d  rg = pArg;.  db-
11250 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c 49 54  >mTrace &= SQLIT
11260 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47 41 43  E_TRACE_NONLEGAC
11270 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 64 62  Y_MASK;.  if( db
11280 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64 62 2d  ->xProfile ) db-
11290 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c 49 54  >mTrace |= SQLIT
112a0 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49 4c 45  E_TRACE_XPROFILE
112b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
112c0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
112d0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
112e0 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
112f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
11300 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20  CATED */.#endif 
11310 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
11320 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
11330 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
11340 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
11350 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11360 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
11370 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
11380 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11390 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
113a0 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
113b0 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
113c0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
113d0 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
113e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
113f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
11400 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
11410 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
11420 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
11430 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
11440 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
11450 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
11460 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
11470 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
11480 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
11490 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
114a0 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
114b0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
114c0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
114d0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
114e0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
114f0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
11500 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
11510 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
11520 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
11530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11540 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11550 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
11560 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
11570 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
11580 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
11590 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
115a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
115b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
115c0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
115d0 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
115e0 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
115f0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
11600 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
11610 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
11620 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
11630 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
11640 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11650 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
11660 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
11670 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11690 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
116a0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
116b0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
116c0 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
116d0 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
116e0 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
116f0 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
11700 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
11710 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
11720 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
11730 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
11740 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pRet;..#ifdef SQ
11750 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
11760 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
11770 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
11780 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
11790 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
117a0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
117b0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
117c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
117d0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
117e0 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
117f0 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
11800 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
11810 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11820 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
11830 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11840 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11850 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11860 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
11870 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
11880 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
11890 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
118a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
118b0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
118c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
118d0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
118e0 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
118f0 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
11900 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11910 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
11920 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
11930 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
11940 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
11950 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
11960 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
11970 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11990 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
119a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
119b0 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
119c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
119d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
119e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
119f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
11a00 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
11a10 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
11a20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11a30 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11a40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11a50 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
11a60 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
11a70 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
11a80 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
11a90 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
11aa0 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
11ab0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11ac0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11ad0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11ae0 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
11af0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
11b00 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a  UPDATE_HOOK./*.*
11b10 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
11b20 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
11b30 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
11b40 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
11b50 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
11b60 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
11b70 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
11b80 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
11b90 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
11ba0 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
11bb0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11bc0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
11bd0 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
11be0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
11bf0 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20  d(*xCallback)(  
11c00 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61         /* Callba
11c10 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
11c20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33     void*,sqlite3
11c30 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
11c40 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71  *,char const*,sq
11c50 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69  lite3_int64,sqli
11c60 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te3_int64),.  vo
11c70 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
11c80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11c90 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65   callback argume
11ca0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  nt */.){.  void 
11cb0 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
11cc0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11cd0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
11ce0 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  = db->pPreUpdate
11cf0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  Arg;.  db->xPreU
11d00 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
11d10 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11d20 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20 3d  >pPreUpdateArg =
11d30 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11d40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11d50 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11d60 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
11d70 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11d80 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
11d90 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11da0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
11db0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
11dc0 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
11dd0 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
11de0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
11df0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
11e00 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
11e10 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
11e20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
11e30 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
11e40 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
11e50 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
11e60 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
11e70 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
11e80 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
11e90 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
11ea0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
11eb0 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
11ec0 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
11ed0 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
11ee0 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
11ef0 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
11f00 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11f10 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
11f20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11f30 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
11f40 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11f50 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
11f60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
11f70 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
11f80 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
11f90 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
11fa0 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
11fb0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
11fc0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
11fd0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11fe0 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
11ff0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
12000 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
12010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12020 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
12030 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
12040 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
12050 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
12060 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
12070 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
12080 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
12090 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
120a0 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
120b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
120c0 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
120d0 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
120e0 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
120f0 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
12100 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
12110 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
12120 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
12130 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
12140 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
12150 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
12160 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
12170 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
12180 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
12190 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
121a0 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
121b0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
121c0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
121d0 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
121e0 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
121f0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
12200 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
12210 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
12220 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
12230 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
12240 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
12250 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
12260 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
12270 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
12280 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
12290 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
122a0 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
122b0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
122c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
122d0 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
122e0 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  se.#ifdef SQLITE
122f0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
12300 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
12310 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
12320 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
12330 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
12340 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61  endif.  if( nFra
12350 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  me>0 ){.    sqli
12360 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
12370 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
12380 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49  ltHook, SQLITE_I
12390 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65  NT_TO_PTR(nFrame
123a0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
123b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
123c0 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  k(db, 0, 0);.  }
123d0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
123e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
123f0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
12400 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
12410 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
12420 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12430 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
12440 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
12450 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61  d-log by this da
12460 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12470 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
12480 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20  te3_wal_hook(.  
12490 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
124c0 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61  ok to this db ha
124d0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ndle */.  int(*x
124e0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
124f0 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
12500 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20  t char*, int),. 
12510 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
12540 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61  nt passed to xCa
12550 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23  llback() */.){.#
12560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12570 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70  IT_WAL.  void *p
12580 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Ret;.#ifdef SQLI
12590 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
125a0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
125b0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
125c0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
125d0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
125e0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
125f0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
12600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12610 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12620 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61    pRet = db->pWa
12630 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c  lArg;.  db->xWal
12640 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
12650 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c  back;.  db->pWal
12660 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
12670 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12680 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12690 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c  return pRet;.#el
126a0 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
126b0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
126c0 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
126d0 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73  se zDb..*/.int s
126e0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
126f0 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69  point_v2(.  sqli
12700 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
12710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
12720 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
12730 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12740 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
12750 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
12760 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12770 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
12780 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20  int eMode,      
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  /* SQLITE_CHECKP
127b0 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  OINT_* value */.
127c0 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20    int *pnLog,   
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
127f0 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61  f WAL log in fra
12800 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
12810 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20  Ckpt            
12820 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12830 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
12840 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69   frames checkpoi
12850 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  nted */.){.#ifde
12860 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
12870 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
12880 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
12890 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
128c0 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
128d0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
128e0 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
128f0 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
12900 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
12910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12920 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
12930 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
12940 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
12950 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12960 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
12970 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  dif..  /* Initia
12980 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
12990 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
129a0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
129b0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
129c0 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
129d0 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
129e0 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
129f0 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
12a00 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12a10 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20  _PASSIVE==0 );. 
12a20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
12a30 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d  CHECKPOINT_FULL=
12a40 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
12a50 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12a60 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a  T_RESTART==2 );.
12a70 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
12a80 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
12a90 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28  CATE==3 );.  if(
12aa0 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48   eMode<SQLITE_CH
12ab0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12ac0 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45   || eMode>SQLITE
12ad0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
12ae0 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45  CATE ){.    /* E
12af0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
12b00 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20  996-12088 The M 
12b10 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
12b20 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70  e a valid checkp
12b30 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  oint.    ** mode
12b40 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  : */.    return 
12b50 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
12b60 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
12b70 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12b80 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20  tex);.  if( zDb 
12b90 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20  && zDb[0] ){.   
12ba0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
12bb0 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
12bc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
12bd0 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
12be0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12bf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
12c00 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
12c10 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
12c20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
12c30 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
12c40 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
12c50 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  r.nBusy = 0;.   
12c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
12c70 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c  ckpoint(db, iDb,
12c80 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
12c90 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  nCkpt);.    sqli
12ca0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
12cb0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
12cc0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
12cd0 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  rc);..  /* If th
12ce0 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
12cf0 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c  e statements, cl
12d00 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75 70  ear the interrup
12d10 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20  t flag at this. 
12d20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20   ** point.  */. 
12d30 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
12d40 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  tive==0 ){.    d
12d50 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
12d60 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ted = 0;.  }..  
12d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12d80 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
12da0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
12db0 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
12dc0 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
12dd0 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
12de0 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
12df0 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
12e00 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
12e10 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
12e20 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
12e30 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
12e40 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
12e50 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
12e60 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
12e70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
12e80 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  {.  /* EVIDENCE-
12e90 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35  OF: R-41613-2055
12ea0 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  3 The sqlite3_wa
12eb0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58  l_checkpoint(D,X
12ec0 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ) is equivalent 
12ed0 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
12ee0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
12ef0 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45  2(D,X,SQLITE_CHE
12f00 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
12f10 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72  0,0). */.  retur
12f20 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
12f30 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a  eckpoint_v2(db,z
12f40 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  Db,SQLITE_CHECKP
12f50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
12f60 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
12f70 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
12f80 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70  .** Run a checkp
12f90 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65  oint on database
12fa0 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20   iDb. This is a 
12fb0 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73  no-op if databas
12fc0 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20  e iDb is.** not 
12fd0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69  currently open i
12fe0 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  n WAL mode..**.*
12ff0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
13000 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
13010 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
13020 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74   checkpointed, t
13030 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
13040 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
13050 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65  LOCKED and a che
13060 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61  ckpoint is not a
13070 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a  ttempted. If .**
13080 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13090 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74   while running t
130a0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61  he checkpoint, a
130b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
130c0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
130d0 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ned (i.e. SQLITE
130e0 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69  _IOERR). Otherwi
130f0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
13100 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f  *.** The mutex o
13110 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
13120 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68  e db should be h
13130 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eld by the calle
13140 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  r. The mutex.** 
13150 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13160 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74  the specific b-t
13170 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ree being checkp
13180 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20  ointed is taken 
13190 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
131a0 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68  ion while the ch
131b0 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e  eckpoint is runn
131c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ing..**.** If iD
131d0 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49  b is passed SQLI
131e0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
131f0 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68   then all attach
13200 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
13210 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
13220 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  . If an error is
13230 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
13240 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
13250 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20  diately -.** no 
13260 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
13270 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  to checkpoint an
13280 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61  y remaining data
13290 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  bases..**.** Par
132a0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20  ameter eMode is 
132b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
132c0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
132d0 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a  , FULL, RESTART.
132e0 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a  ** or TRUNCATE..
132f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
13300 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
13310 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
13320 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
13330 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
13340 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13350 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13360 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13370 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
133a0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
133b0 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
133c0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
133d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
133e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
133f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
13400 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
13410 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
13420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13430 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
13440 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
13450 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
13460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
13470 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
13480 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
13490 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
134a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
134b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
134c0 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
134d0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
134e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
134f0 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
13500 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
13510 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
13520 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
13530 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
13540 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
13550 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13560 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
13570 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
13580 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13590 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
135a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
135b0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
135c0 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
135d0 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
135e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
135f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
13600 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13610 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
13620 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
13630 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
13640 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
13650 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
13660 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
13670 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
13680 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
13690 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
136a0 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
136b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
136c0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
136d0 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
136e0 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
136f0 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
13700 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
13710 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
13720 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
13730 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
13740 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
13750 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
13760 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
13770 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
13780 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
13790 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
137a0 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
137b0 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
137c0 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
137d0 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
13800 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13820 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
13860 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13890 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
138a0 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
138d0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
138e0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
138f0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13900 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13910 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
13920 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
13930 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13940 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
13950 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13960 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13970 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13980 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
139a0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
139b0 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
139f0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
13a20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
13a30 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
13a40 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
13a50 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
13a60 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
13a70 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13a80 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
13a90 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
13aa0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
13ab0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13ac0 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
13ad0 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
13ae0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
13af0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
13b00 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
13b10 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
13b20 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
13b30 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
13b40 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
13b50 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e  EMP_STORE>3.  UN
13b60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
13b70 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b);.  return 0;.
13b80 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13b90 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
13ba0 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
13bb0 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
13bc0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
13bd0 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
13be0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
13bf0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
13c00 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
13c10 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
13c20 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
13c30 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
13c40 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  r(SQLITE_NOMEM_B
13c50 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  KPT);.  }.  if( 
13c60 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
13c70 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
13c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
13c90 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
13ca0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
13cb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13cc0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
13cd0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
13ce0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13cf0 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
13d00 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
13d10 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c  MEM_BKPT);.  }el
13d20 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65  se{.    testcase
13d30 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b  ( db->pErr==0 );
13d40 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65 72 72  .    z = db->err
13d50 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29 73 71  Code ? (char*)sq
13d60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13d70 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30 3b 0a  (db->pErr) : 0;.
13d80 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
13d90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13da0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
13db0 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
13dc0 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
13dd0 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
13de0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13df0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
13e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
13e10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13e20 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
13e30 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
13e40 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
13e50 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
13e60 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
13e70 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
13e80 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
13e90 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
13ea0 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
13eb0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13ec0 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
13ed0 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
13ee0 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
13ef0 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
13f00 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
13f10 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
13f20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
13f30 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
13f40 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27 2c    'b', 'a', 'd',
13f50 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c 20   ' ', 'p', 'a', 
13f60 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27  'r', 'a', 'm', '
13f70 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27 72  e', 't', 'e', 'r
13f80 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c  ', ' ',.    'o',
13f90 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   'r', ' ', 'o', 
13fa0 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20 27  't', 'h', 'e', '
13fb0 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27 50  r', ' ', 'A', 'P
13fc0 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20 20  ', 'I', ' ',.   
13fd0 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c 20   'm', 'i', 's', 
13fe0 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20 30  'u', 's', 'e', 0
13ff0 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
14000 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
14010 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
14020 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
14030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
14040 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
14050 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
14060 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
14070 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
14080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14090 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
140a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
140b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
140c0 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
140d0 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
140e0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
140f0 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
14100 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
14110 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14120 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
14130 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
14140 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
14150 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
14160 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
14170 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
14180 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
14190 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
141a0 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
141b0 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
141c0 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
141d0 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
141e0 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
141f0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
14200 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
14210 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
14220 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
14230 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
14240 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
14250 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
14260 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
14270 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
14280 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
14290 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
142a0 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
142b0 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
142c0 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72   sqlite3OomClear
142d0 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
142e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
142f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
14300 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
14310 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14320 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
14330 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
14340 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
14350 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
14360 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
14370 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
14380 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
14390 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
143a0 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
143b0 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
143c0 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
143d0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
143e0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
143f0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
14400 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
14410 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
14420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14430 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
14440 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
14450 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14460 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14470 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
14490 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
144a0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
144b0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
144c0 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
144d0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
144e0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
144f0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
14500 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
14510 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
14520 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
14530 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
14540 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
14550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14560 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
14570 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
14580 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
14590 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c  system_errno(sql
145a0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
145b0 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79  urn db ? db->iSy
145c0 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a  sErrno : 0;.}  .
145d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
145e0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
145f0 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
14600 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
14610 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
14620 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
14630 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
14640 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
14650 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
14660 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
14670 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
14680 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
14690 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
146a0 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
146b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
146c0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
146d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
146e0 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
146f0 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
14700 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
14710 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
14720 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
14730 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
14740 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
14750 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
14760 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
14770 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
14780 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
14790 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
147a0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
147b0 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
147c0 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
147d0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
147e0 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
147f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14800 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
14810 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
14820 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
14830 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
14840 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
14850 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
14860 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
14870 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
14880 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
14890 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
148a0 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
148b0 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
148c0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
148d0 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
148e0 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
148f0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
14900 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
14910 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
14920 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
14930 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
14940 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
14950 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
14960 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
14970 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
14980 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
14990 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
149a0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
149b0 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
149c0 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
149d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
149e0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
149f0 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
14a00 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
14a10 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
14a20 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
14a30 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
14a40 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
14a50 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
14a60 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
14a70 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
14a80 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
14a90 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
14aa0 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
14ab0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
14ac0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
14ad0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
14ae0 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
14af0 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
14b00 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
14b10 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
14b20 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
14b30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
14b40 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
14b50 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
14b60 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
14b70 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
14b80 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
14b90 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
14ba0 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
14bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14bd0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
14be0 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20  dStatements(db, 
14bf0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  0);..    /* If c
14c00 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14c10 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
14c20 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
14c30 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
14c40 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14c50 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
14c60 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
14c70 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
14c80 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
14c90 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
14ca0 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
14cb0 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
14cc0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
14cd0 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
14ce0 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
14cf0 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
14d00 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
14d10 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
14d20 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
14d30 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
14d40 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
14d50 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
14d60 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
14d70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
14d80 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
14d90 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  lSeq, zName);.  
14da0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
14db0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
14dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
14dd0 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
14de0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
14df0 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
14e00 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
14e10 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
14e20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
14e30 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
14e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14e50 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
14e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14e80 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14e90 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14ea0 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
14eb0 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
14ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14ed0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14ee0 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
14ef0 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
14f00 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
14f10 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
14f20 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
14f30 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
14f40 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
14f50 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
14f60 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
14f70 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f90 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
14fa0 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
14fb0 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
14fc0 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
14fd0 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
14fe0 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
14ff0 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
15000 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
15010 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
15020 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
15030 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
15040 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
15050 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
15060 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
15070 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
15080 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
15090 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
150a0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
150b0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
150c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
150d0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
150e0 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
150f0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
15100 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
15110 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
15120 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
15130 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
15140 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
15150 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
15160 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
15170 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
15180 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
15190 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
151a0 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
151b0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
151c0 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
151d0 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
151e0 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
151f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15200 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
15210 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
15220 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
15230 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
15240 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15250 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
15260 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15270 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
15280 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
15290 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
152a0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
152b0 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
152c0 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
152d0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
152e0 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
152f0 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
15300 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
15310 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15320 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
15330 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
15340 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
15350 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
15360 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
15370 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15380 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
15390 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
153a0 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
153b0 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
153c0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
153d0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
153e0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
153f0 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a  UNCTION_ARG>127.
15400 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15410 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
15420 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
15430 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69 66  0 and 127.#endif
15440 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15450 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
15460 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15470 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51  D>125.# error SQ
15480 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15490 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
154a0 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64  n 0 and 125.#end
154b0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
154c0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
154d0 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
154e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
154f0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
15500 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
15510 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
15520 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
15530 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
15540 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
15550 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
15560 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
15570 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
15580 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
15590 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
155a0 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
155b0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
155c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
155d0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
155e0 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ADS<0 || SQLITE_
155f0 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
15600 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51  DS>50.# error SQ
15610 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
15620 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65 20  THREADS must be 
15630 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30  between 0 and 50
15640 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
15650 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
15660 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65   of a limit.  Re
15670 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
15680 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76  ue..** If an inv
15690 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78  alid limit index
156a0 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65   is supplied, re
156b0 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65  port -1..** Make
156c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20   no changes but 
156d0 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65  still report the
156e0 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68   old value if th
156f0 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69  e.** new limit i
15700 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  s negative..**.*
15710 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69  * A new lower li
15720 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72  mit does not shr
15730 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  ink existing con
15740 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d  structs..** It m
15750 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e  erely prevents n
15760 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68  ew constructs th
15770 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69  at exceed the li
15780 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d  mit.** from form
15790 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
157a0 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65  te3_limit(sqlite
157b0 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74  3 *db, int limit
157c0 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74  Id, int newLimit
157d0 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69  ){.  int oldLimi
157e0 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
157f0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
15800 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
15810 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
15820 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
15830 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
15840 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
15850 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
15860 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
15870 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46   R-30189-54097 F
15880 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61  or each limit ca
15890 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49  tegory SQLITE_LI
158a0 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68  MIT_NAME.  ** th
158b0 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70  ere is a hard up
158c0 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74  per bound set at
158d0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79   compile-time by
158e0 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f   a C preprocesso
158f0 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c  r.  ** macro cal
15900 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e  led SQLITE_MAX_N
15910 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49  AME. (The "_LIMI
15920 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  T_" in the name 
15930 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20  is changed to.  
15940 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a  ** "_MAX_".).  *
15950 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  /.  assert( aHar
15960 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15970 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  MIT_LENGTH]==SQL
15980 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
15990 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
159a0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
159b0 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d  MIT_SQL_LENGTH]=
159c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f  =SQLITE_MAX_SQL_
159d0 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
159e0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
159f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
15a00 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  MN]==SQLITE_MAX_
15a10 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
15a20 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
15a30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
15a40 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
15a50 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
15a60 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15a70 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15a80 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15a90 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ECT]==SQLITE_MAX
15aa0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15ac0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15ad0 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53  IMIT_VDBE_OP]==S
15ae0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
15af0 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  P );.  assert( a
15b00 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15b10 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
15b20 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ARG]==SQLITE_MAX
15b30 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b  _FUNCTION_ARG );
15b40 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15b50 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15b60 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51  IT_ATTACHED]==SQ
15b70 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15b80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
15b90 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15ba0 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
15bb0 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20  ERN_LENGTH]==.  
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15bf0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
15c00 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  TERN_LENGTH );. 
15c10 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15c20 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15c30 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
15c40 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ]==SQLITE_MAX_VA
15c50 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
15c60 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15c70 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15c80 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
15c90 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  ==SQLITE_MAX_TRI
15ca0 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  GGER_DEPTH );.  
15cb0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
15cc0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
15cd0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d  WORKER_THREADS]=
15ce0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  =SQLITE_MAX_WORK
15cf0 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20  ER_THREADS );.  
15d00 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c  assert( SQLITE_L
15d10 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
15d20 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  ADS==(SQLITE_N_L
15d30 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
15d40 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
15d50 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
15d60 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
15d70 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15d80 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
15d90 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
15da0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
15db0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
15dc0 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
15dd0 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
15de0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
15df0 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
15e00 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
15e10 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
15e20 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
15e30 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
15e40 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
15e50 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
15e60 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
15e70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
15e80 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ea0 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
15eb0 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
15ec0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15ed0 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
15ee0 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
15ef0 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
15f00 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
15f10 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
15f20 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
15f30 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
15f40 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
15f50 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
15f60 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
15f70 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
15f80 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
15f90 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
15fa0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15fb0 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
15fc0 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
15fd0 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
15fe0 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
15ff0 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
16000 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
16010 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
16020 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
16030 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
16040 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
16050 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
16060 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
16070 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
16080 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
16090 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
160a0 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
160b0 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
160c0 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
160d0 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
160e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
160f0 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
16100 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
16110 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
16120 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
16130 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
16140 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
16150 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
16160 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
16170 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16180 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
16190 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
161a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
161b0 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
161c0 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
161d0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
161e0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
161f0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
16200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16210 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
16220 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
16230 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
16240 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
16250 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
16260 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
16270 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16280 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
16290 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
162a0 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
162b0 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
162c0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
162d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
162e0 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
162f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
16300 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
16310 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
16320 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
16330 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
16340 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
16350 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
16360 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
16370 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
16380 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
16390 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
163a0 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
163b0 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
163c0 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
163d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
163e0 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
163f0 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
16400 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
16410 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
16420 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
16430 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
16440 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
16450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16460 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
16470 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
16480 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
16490 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
164a0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
164b0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
164c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
164d0 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
164e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
164f0 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
16500 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16520 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
16530 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
16540 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
16550 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
16560 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
16570 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
16580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
16590 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
165a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
165b0 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
165c0 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
165d0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
165e0 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
165f0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
16600 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
16610 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
16620 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
16630 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
16640 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
16650 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16660 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20 20  N_URI)          
16670 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37     /* IMP: R-487
16680 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20  25-32206 */.    
16690 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
166a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
166b0 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a  OpenUri) /* IMP:
166c0 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a   R-51689-46548 *
166d0 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20  /.   && nUri>=5 
166e0 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
166f0 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f  "file:", 5)==0 /
16700 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33  * IMP: R-57884-3
16710 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  7496 */.  ){.   
16720 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
16730 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16750 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
16760 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
16770 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
167a0 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
167b0 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
167c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
167d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
167e0 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
167f0 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20      u64 nByte = 
16800 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
16810 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
16820 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
16830 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
16840 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
16850 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
16860 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
16870 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
16880 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
16890 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
168a0 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
168b0 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
168c0 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
168d0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
168e0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
168f0 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
16900 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
16910 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
16920 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
16930 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
16940 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
16950 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
16960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16970 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  OMEM_BKPT;..    
16980 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20  iIn = 5;.#ifdef 
16990 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49  SQLITE_ALLOW_URI
169a0 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69  _AUTHORITY.    i
169b0 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
169c0 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  5, "///", 3)==0 
169d0 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
169e0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
169f0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
16a00 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77  on causes URIs w
16a10 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67  ith five leading
16a20 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
16a30 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65      ** like file
16a40 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ://///host/path 
16a50 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
16a60 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f  into UNCs like /
16a70 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20  /host/path..    
16a80 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74    ** The correct
16a90 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e   URI for that UN
16aa0 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f  C has only two o
16ab0 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f  r four leading /
16ac0 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
16ad0 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74    ** file://host
16ae0 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f  /path or file://
16af0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75  //host/path.  Bu
16b00 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73  t 5 leading slas
16b10 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20  hes is a .      
16b20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c  ** common error,
16b30 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f   we are told, so
16b40 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73   we handle it as
16b50 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e   a special case.
16b60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
16b70 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f  rncmp(zUri+7, "/
16b80 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49  //", 3)==0 ){ iI
16b90 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  n++; }.    }else
16ba0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
16bb0 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73  i+5, "//localhos
16bc0 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20  t/", 12)==0 ){. 
16bd0 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20       iIn = 16;. 
16be0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
16bf0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
16c00 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
16c10 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
16c20 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
16c30 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
16c40 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
16c50 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
16c60 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
16c70 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
16c80 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
16c90 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49  ++;.      if( iI
16ca0 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
16cb0 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
16cc0 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
16cd0 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
16ce0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
16cf0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
16d00 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
16d10 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
16d20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
16d30 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
16d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16d50 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
16d60 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
16d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16d80 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
16d90 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
16da0 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
16db0 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
16dc0 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
16dd0 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
16de0 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
16df0 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
16e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
16e10 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
16e20 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
16e30 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
16e40 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
16e50 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
16e60 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
16e70 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
16e80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
16e90 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
16ea0 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
16eb0 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
16ec0 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
16ed0 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
16ee0 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
16ef0 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
16f00 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
16f10 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
16f20 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
16f30 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
16f40 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
16f50 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
16f60 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
16f70 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
16f80 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
16f90 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
16fa0 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
16fb0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
16fc0 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
16fd0 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
16fe0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
16ff0 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
17000 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
17010 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
17020 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
17030 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
17040 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
17050 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
17060 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
17070 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17080 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  octet==0 ){.#ifn
17090 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
170a0 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20  E_URI_00_ERROR. 
170b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
170c0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
170d0 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
170e0 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
170f0 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
17100 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
17110 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
17120 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
17130 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
17140 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
17150 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
17160 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
17170 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
17180 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
17190 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
171a0 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
171b0 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
171c0 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
171d0 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
171e0 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
171f0 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
17200 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
17210 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
17220 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
17230 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
17240 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
17250 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
17260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
17270 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
17280 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
17290 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
172a0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
172b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
172c0 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20  ntinue;.#else.  
172d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45 4e          /* If EN
172e0 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
172f0 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22 25  R is defined, "%
17300 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73 20  00" in a URI is 
17310 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  an error. */.   
17320 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
17330 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17340 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20 25  tf("unexpected %
17350 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20 20  %00 in uri");.  
17360 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17370 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
17380 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
17390 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a  uri_out;.#endif.
173a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
173b0 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
173c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
173d0 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
173e0 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
173f0 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
17400 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
17410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
17420 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
17430 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
17440 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
17450 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
17460 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
17470 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
17480 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
17490 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
174a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
174b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
174c0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
174d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
174e0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
174f0 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
17500 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
17510 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
17520 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
17530 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17540 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
17550 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
17560 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
17570 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
17580 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
17590 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
175a0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
175b0 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
175c0 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
175d0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
175e0 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
175f0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
17600 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
17610 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
17620 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
17630 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
17640 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
17650 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
17660 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
17670 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
17680 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
17690 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
176a0 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
176b0 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
176c0 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
176d0 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
176e0 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
176f0 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
17700 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
17710 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
17720 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17730 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
17740 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
17750 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
17760 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17770 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
17780 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
17790 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
177a0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
177b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
177c0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
177d0 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
177e0 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
177f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
17800 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
17810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17820 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
17830 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
17840 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
17850 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
17860 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
17870 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
17880 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
17890 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
178a0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
178b0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
178c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
178d0 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
178e0 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
178f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17900 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
17910 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
17920 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
17930 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
17940 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
17950 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
17960 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
17970 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
17980 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
17990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
179a0 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
179b0 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
179c0 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
179d0 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
179e0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
179f0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
17a00 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
17a10 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
17a20 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
17a30 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
17a40 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
17a50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17a60 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
17a70 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
17a80 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
17a90 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
17aa0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
17ab0 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
17ac0 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
17ad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17ae0 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
17af0 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
17b00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17b10 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
17b20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
17b30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
17b40 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17b50 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
17b60 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
17b70 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
17b80 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
17b90 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
17ba0 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
17bb0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
17bc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17bd0 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
17be0 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17c10 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
17c20 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
17c30 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
17c40 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
17c50 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
17c60 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
17c70 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
17c80 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
17c90 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
17ca0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
17cb0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
17cc0 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
17cd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17ce0 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
17cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
17d00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
17d10 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
17d20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
17d30 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
17d40 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
17d50 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
17d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17d70 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
17d80 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
17d90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17dc0 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
17dd0 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
17de0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
17df0 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
17e00 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
17e10 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
17e20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17e30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17e40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
17e50 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
17e60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e70 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
17e80 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
17e90 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
17ea0 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
17eb0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
17ec0 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
17ed0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
17ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17f10 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
17f20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17f30 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
17f40 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
17f50 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
17f60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17f70 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
17f80 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
17f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17fa0 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
17fb0 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
17fc0 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
17fd0 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
17fe0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69  e3_malloc64(nUri
17ff0 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  +2);.    if( !zF
18000 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
18010 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
18020 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b 0a      if( nUri ){.
18030 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69        memcpy(zFi
18040 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
18050 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
18060 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nUri] = '\0';. 
18070 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d     zFile[nUri+1]
18080 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61   = '\0';.    fla
18090 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
180a0 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a  EN_URI;.  }..  *
180b0 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ppVfs = sqlite3_
180c0 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
180d0 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20    if( *ppVfs==0 
180e0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
180f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18100 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  tf("no such vfs:
18110 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
18120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
18130 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75  OR;.  }. parse_u
18140 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  ri_out:.  if( rc
18150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18160 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18170 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c  zFile);.    zFil
18180 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46  e = 0;.  }.  *pF
18190 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
181a0 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  *pzFile = zFile;
181b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
181c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
181d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f  ITE_HAS_CODEC)./
181e0 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 55 52 49  *.** Process URI
181f0 20 66 69 6c 65 6e 61 6d 65 20 71 75 65 72 79 20   filename query 
18200 70 61 72 61 6d 65 74 65 72 73 20 72 65 6c 65 76  parameters relev
18210 61 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ant to the SQLit
18220 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a 2a 2a 20  e Encryption.** 
18230 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52 65 74 75  Extension.  Retu
18240 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 6f  rn true if any o
18250 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 71  f the relevant q
18260 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
18270 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61 6e 64 20  are.** seen and 
18280 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  return false if 
18290 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
182a0 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61 72  te3CodecQueryPar
182b0 61 6d 65 74 65 72 73 28 0a 20 20 73 71 6c 69 74  ameters(.  sqlit
182c0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
182d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
182e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
182f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
18300 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 63       /* Which sc
18310 68 65 6d 61 20 69 73 20 62 65 69 6e 67 20 63 72  hema is being cr
18320 65 61 74 65 64 2f 61 74 74 61 63 68 65 64 20 2a  eated/attached *
18330 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18340 7a 55 72 69 20 20 20 20 20 20 20 2f 2a 20 55 52  zUri       /* UR
18350 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29 7b  I filename */.){
18360 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18370 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a 4b 65 79  Key;.  if( (zKey
18380 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
18390 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22  arameter(zUri, "
183a0 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26 26 20  hexkey"))!=0 && 
183b0 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 75  zKey[0] ){.    u
183c0 38 20 69 42 79 74 65 3b 0a 20 20 20 20 69 6e 74  8 iByte;.    int
183d0 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44 65   i;.    char zDe
183e0 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 66  coded[40];.    f
183f0 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
18400 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
18410 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
18420 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
18430 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
18440 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
18450 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
18460 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20  Int(zKey[i]);.  
18470 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30      if( (i&1)!=0
18480 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d   ) zDecoded[i/2]
18490 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = iByte;.    }.
184a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
184b0 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 44 65 63  v2(db, zDb, zDec
184c0 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20 20  oded, i/2);.    
184d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
184e0 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
184f0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
18500 74 65 72 28 7a 55 72 69 2c 20 22 6b 65 79 22 29  ter(zUri, "key")
18510 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
18520 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
18530 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65  Db, zKey, sqlite
18540 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29  3Strlen30(zKey))
18550 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
18560 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65    }else if( (zKe
18570 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
18580 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20  parameter(zUri, 
18590 22 74 65 78 74 6b 65 79 22 29 29 21 3d 30 20 29  "textkey"))!=0 )
185a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65  {.    sqlite3_ke
185b0 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
185c0 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ey, -1);.    ret
185d0 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
185e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
185f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
18600 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18610 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
18620 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
18630 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
18640 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
18650 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
18660 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
18670 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
18680 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
18690 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
186a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
186b0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
186c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
186d0 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
186e0 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
186f0 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
18700 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
18710 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
18720 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
18730 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
18740 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
18750 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
18760 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
18770 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
18780 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18790 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
187a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
187b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
187c0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
187d0 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
187e0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
187f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18810 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
18820 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18840 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
18850 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
18860 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
18870 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
18880 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
18890 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
188a0 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
188b0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
188c0 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
188d0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
188e0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
188f0 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
18900 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
18910 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
18920 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
18930 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18940 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
18950 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
18960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18970 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
18980 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
18990 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
189a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
189b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
189c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
189d0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
189e0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
189f0 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
18a00 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
18a10 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
18a20 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
18a30 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
18a40 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
18a50 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
18a60 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
18a70 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
18a80 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
18a90 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
18aa0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
18ab0 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a 20  ullMutex;.  }.. 
18ac0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
18ad0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
18ae0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
18af0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
18b00 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
18b10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
18b20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18b30 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
18b40 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
18b50 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
18b60 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
18b70 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
18b80 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
18b90 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
18ba0 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
18bb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
18bc0 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
18bd0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
18be0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
18bf0 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
18c00 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
18c10 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
18c20 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
18c30 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
18c40 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
18c50 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
18c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18c70 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
18c80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18c90 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
18ca0 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
18cb0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
18cc0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
18cd0 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
18ce0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
18cf0 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
18d00 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
18d10 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
18d20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
18d30 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
18d40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18d60 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
18d70 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
18d80 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18d90 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
18da0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18db0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
18dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18dd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
18de0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
18df0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18e00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18e10 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
18e20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18e30 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
18e40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
18e60 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
18e70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18e80 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18e90 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
18ea0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18eb0 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
18ec0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18ed0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
18ee0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18ef0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
18f00 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
18f10 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
18f20 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
18f30 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
18f40 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
18f50 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
18f60 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
18f70 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
18f80 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
18f90 69 73 54 68 72 65 61 64 73 61 66 65 20 0a 23 69  isThreadsafe .#i
18fa0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18fb0 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45 44  LE_MULTITHREADED
18fc0 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73 71  _CHECKS.   || sq
18fd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18fe0 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65 6e  g.bCoreMutex.#en
18ff0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62 2d  dif.  ){.    db-
19000 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
19010 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
19020 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
19030 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
19040 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
19050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
19060 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
19070 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
19080 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
19090 20 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73     if( isThreads
190a0 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  afe==0 ){.      
190b0 73 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72 6e  sqlite3MutexWarn
190c0 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62 2d  OnContention(db-
190d0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
190e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
190f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19100 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
19110 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
19120 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
19130 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
19140 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
19150 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
19160 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  atic;.  db->look
19170 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d  aside.bDisable =
19180 20 31 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73   1;.  db->lookas
19190 69 64 65 2e 73 7a 20 3d 20 30 3b 0a 0a 20 20 61  ide.sz = 0;..  a
191a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
191b0 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
191c0 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
191d0 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
191e0 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
191f0 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
19200 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69  mit));.  db->aLi
19210 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
19220 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
19230 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
19240 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
19250 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
19260 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
19270 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
19280 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73    db->szMmap = s
19290 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
192a0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d  ig.szMmap;.  db-
192b0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
192c0 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72  0;.  db->nMaxSor
192d0 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46  terMmap = 0x7FFF
192e0 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  FFFF;.  db->flag
192f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
19300 74 43 6f 6c 4e 61 6d 65 73 0a 20 20 20 20 20 20  tColNames.      
19310 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
19320 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
19330 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
19340 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62     | SQLITE_Enab
19350 6c 65 56 69 65 77 0a 20 20 20 20 20 20 20 20 20  leView.         
19360 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19370 5f 43 61 63 68 65 53 70 69 6c 6c 0a 0a 2f 2a 20  _CacheSpill../* 
19380 54 68 65 20 53 51 4c 49 54 45 5f 44 51 53 20 63  The SQLITE_DQS c
19390 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
193a0 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  on determines th
193b0 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
193c0 67 73 0a 2a 2a 20 66 6f 72 20 53 51 4c 49 54 45  gs.** for SQLITE
193d0 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 44  _DBCONFIG_DQS_DD
193e0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 44 42 43  L and SQLITE_DBC
193f0 4f 4e 46 49 47 5f 44 51 53 5f 44 4d 4c 2e 0a 2a  ONFIG_DQS_DML..*
19400 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  *.**    SQLITE_D
19410 51 53 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  QS     SQLITE_DB
19420 43 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20 20  CONFIG_DQS_DDL  
19430 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
19440 47 5f 44 51 53 5f 44 4d 4c 0a 2a 2a 20 20 20 20  G_DQS_DML.**    
19450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
19460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19470 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
19480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19490 2d 0a 2a 2a 20 20 20 20 20 75 6e 64 65 66 69 6e  -.**     undefin
194a0 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
194b0 20 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20   on             
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
194d0 20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 33 20    .**         3 
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20    on            
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
19510 0a 2a 2a 20 20 20 20 20 20 20 20 20 32 20 20 20  .**         2   
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
19540 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 0a 2a             off.*
19550 2a 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20  *         1     
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66               off
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 20 20 20 20 20 20 6f 6e 0a 2a 2a 20            on.** 
19590 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
195a0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 20 20             off  
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 20 20 6f 66 66 0a 2a 2a 0a 2a 2a         off.**.**
195d0 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
195e0 20 69 73 20 33 20 28 64 6f 75 62 6c 65 2d 71 75   is 3 (double-qu
195f0 6f 74 65 64 20 73 74 72 69 6e 67 20 6c 69 74 65  oted string lite
19600 72 61 6c 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  rals are allowed
19610 20 61 6e 79 77 68 65 72 65 29 0a 2a 2a 20 61 6e   anywhere).** an
19620 64 20 73 6f 20 74 68 61 74 20 69 73 20 74 68 65  d so that is the
19630 20 64 65 66 61 75 6c 74 2e 20 20 42 75 74 20 64   default.  But d
19640 65 76 65 6c 6f 70 65 72 73 20 61 72 65 20 65 6e  evelopers are en
19650 63 6f 75 72 61 6e 67 65 64 20 74 6f 20 75 73 65  couranged to use
19660 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 44 51 53  .** -DSQLITE_DQS
19670 3d 30 20 28 62 65 73 74 29 20 6f 72 20 2d 44 53  =0 (best) or -DS
19680 51 4c 49 54 45 5f 44 51 53 3d 31 20 28 73 65 63  QLITE_DQS=1 (sec
19690 6f 6e 64 20 63 68 6f 69 63 65 29 20 69 66 20 70  ond choice) if p
196a0 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20  ossible..*/.#if 
196b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
196c0 44 51 53 29 0a 23 20 64 65 66 69 6e 65 20 53 51  DQS).# define SQ
196d0 4c 49 54 45 5f 44 51 53 20 33 0a 23 65 6e 64 69  LITE_DQS 3.#endi
196e0 66 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 44 51  f.#if (SQLITE_DQ
196f0 53 26 31 29 3d 3d 31 0a 20 20 20 20 20 20 20 20  S&1)==1.        
19700 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
19710 45 5f 44 71 73 44 4d 4c 0a 23 65 6e 64 69 66 0a  E_DqsDML.#endif.
19720 23 69 66 20 28 53 51 4c 49 54 45 5f 44 51 53 26  #if (SQLITE_DQS&
19730 32 29 3d 3d 32 0a 20 20 20 20 20 20 20 20 20 20  2)==2.          
19740 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19750 44 71 73 44 44 4c 0a 23 65 6e 64 69 66 0a 0a 23  DqsDDL.#endif..#
19760 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
19770 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  TE_DEFAULT_AUTOM
19780 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53  ATIC_INDEX) || S
19790 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
197a0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
197c0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
197d0 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  x.#endif.#if SQL
197e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54  ITE_DEFAULT_CKPT
197f0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20  FULLFSYNC.      
19800 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
19810 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e  ITE_CkptFullFSyn
19820 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  c.#endif.#if SQL
19830 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
19840 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
19850 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
19860 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
19870 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
19880 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
19890 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
198b0 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
198c0 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
198d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
198e0 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
198f0 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
19900 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
19910 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23  riggers.#endif.#
19920 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19930 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
19940 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54  N_KEYS) && SQLIT
19950 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
19960 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20  N_KEYS.         
19970 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19980 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e  _ForeignKeys.#en
19990 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
199a0 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55  SQLITE_REVERSE_U
199b0 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53  NORDERED_SELECTS
199c0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
199d0 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65     | SQLITE_Reve
199e0 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a  rseOrder.#endif.
199f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19a00 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
19a10 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a  | SQLITE_CellSiz
19a40 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eCk.#endif.#if d
19a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19a60 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
19a70 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20  ZER).           
19a80 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
19a90 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e  ts3Tokenizer.#en
19aa0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19ab0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51 50  SQLITE_ENABLE_QP
19ac0 53 47 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  SG).            
19ad0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e       | SQLITE_En
19ae0 61 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66 0a  ableQPSG.#endif.
19af0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19b00 54 45 5f 44 45 46 41 55 4c 54 5f 44 45 46 45 4e  TE_DEFAULT_DEFEN
19b10 53 49 56 45 29 0a 20 20 20 20 20 20 20 20 20 20  SIVE).          
19b20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19b30 44 65 66 65 6e 73 69 76 65 0a 23 65 6e 64 69 66  Defensive.#endif
19b40 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
19b50 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
19b60 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
19b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19b80 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
19b90 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
19ba0 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
19bb0 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
19bc0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
19bd0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
19be0 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
19bf0 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
19c00 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
19c10 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
19c20 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
19c30 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
19c40 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
19c50 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
19c60 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
19c70 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
19c80 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
19c90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45  .  **.  ** EVIDE
19ca0 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d  NCE-OF: R-52786-
19cb0 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65 66  44878 SQLite def
19cc0 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c 74  ines three built
19cd0 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  -in collating.  
19ce0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20  ** functions:.  
19cf0 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
19d00 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
19d10 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
19d20 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
19d30 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
19d40 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19d50 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
19d60 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  RY, SQLITE_UTF16
19d70 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  BE, 0, binCollFu
19d80 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
19d90 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
19da0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19db0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
19dc0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
19dd0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
19de0 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
19df0 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
19e00 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74   0, nocaseCollat
19e10 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ingFunc, 0);.  c
19e20 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19e30 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
19e40 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 74 72 69  TE_UTF8, 0, rtri
19e50 6d 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  mCollFunc, 0);. 
19e60 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19e70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
19e80 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
19e90 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  }.  /* EVIDENCE-
19ea0 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32  OF: R-08308-1722
19eb0 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f  4 The default co
19ec0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
19ed0 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74   for all.  ** st
19ee0 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e  rings is BINARY.
19ef0 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66   .  */.  db->pDf
19f00 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
19f10 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
19f20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
19f30 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 30  ite3StrBINARY, 0
19f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
19f50 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
19f60 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
19f70 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
19f80 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a  gument.  **.  **
19f90 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
19fa0 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
19fb0 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
19fc0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
19fd0 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
19fe0 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
19ff0 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
1a000 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
1a010 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
1a020 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
1a030 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
1a040 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
1a050 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
1a060 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
1a070 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
1a080 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
1a090 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
1a0a0 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
1a0b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1a0c0 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
1a0d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a0e0 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
1a0f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a100 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1a110 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 64 62  CREATE.  */.  db
1a120 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
1a130 61 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 53  ags;.  assert( S
1a140 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1a150 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
1a160 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1a170 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1a180 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
1a190 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
1a1a0 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
1a1b0 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
1a1c0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
1a1d0 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
1a1e0 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
1a1f0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
1a200 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
1a210 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
1a220 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
1a230 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
1a240 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
1a250 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
1a260 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
1a270 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
1a280 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49    rc = SQLITE_MI
1a290 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49  SUSE_BKPT;  /* I
1a2a0 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39  MP: R-65497-4459
1a2b0 34 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  4 */.  }else{.  
1a2c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a2d0 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69  rseUri(zVfs, zFi
1a2e0 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20  lename, &flags, 
1a2f0 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65  &db->pVfs, &zOpe
1a300 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n, &zErrMsg);.  
1a310 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
1a320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1a330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1a340 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61  M ) sqlite3OomFa
1a350 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  ult(db);.    sql
1a360 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
1a370 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
1a380 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
1a390 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
1a3a0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1a3b0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
1a3c0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
1a3d0 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
1a3e0 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
1a3f0 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
1a400 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
1a410 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
1a420 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
1a430 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
1a450 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
1a460 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
1a470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a480 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
1a490 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1a4a0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
1a4b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1a4c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
1a4d0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
1a4e0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
1a4f0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71  db_out;.  }.  sq
1a500 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a510 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
1a520 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
1a530 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
1a540 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
1a550 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
1a560 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a570 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20  ailed ) ENC(db) 
1a580 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29  = SCHEMA_ENC(db)
1a590 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a5a0 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d  Leave(db->aDb[0]
1a5b0 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
1a5c0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
1a5d0 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
1a5e0 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  b, 0);..  /* The
1a5f0 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
1a600 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
1a610 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 46  in database is F
1a620 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ULL; for the tem
1a630 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
1a640 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69 73 20  it is OFF. This 
1a650 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
1a660 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
1a670 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
1a680 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[0].zDbSName =
1a690 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
1a6a0 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
1a6b0 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  el = SQLITE_DEFA
1a6c0 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  ULT_SYNCHRONOUS+
1a6d0 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  1;.  db->aDb[1].
1a6e0 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d 70  zDbSName = "temp
1a6f0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
1a700 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50  safety_level = P
1a710 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
1a720 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67  _OFF;..  db->mag
1a730 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1a740 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
1a750 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a760 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
1a770 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
1a780 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
1a790 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
1a7a0 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
1a7b0 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
1a7c0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
1a7d0 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
1a7e0 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
1a7f0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1a800 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1a810 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
1a820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
1a830 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
1a840 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
1a850 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f  sterPerConnectio
1a860 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  nBuiltinFunction
1a870 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  s(db);.  rc = sq
1a880 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
1a890 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1a8a0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20  E_ENABLE_FTS5.  
1a8b0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e 79 20  /* Register any 
1a8c0 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d 6f  built-in FTS5 mo
1a8d0 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61 64  dule before load
1a8e0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
1a8f0 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f 6e  c.  ** extension
1a900 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 61  s. This allows a
1a910 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
1a920 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65 72 20  ons to register 
1a930 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e  FTS5 .  ** token
1a940 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69 6c 69  izers and auxili
1a950 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  ary functions.  
1a960 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
1a970 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1a9a0 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts5Init(db);.  }
1a9b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f  .#endif..  /* Lo
1a9c0 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
1a9d0 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
1a9e0 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
1a9f0 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
1aa00 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
1aa10 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
1aa20 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
1aa30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1aa40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aa50 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
1aa60 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
1aa70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aa80 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
1aa90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1aaa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
1aab0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
1aac0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1aad0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1aae0 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
1aaf0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ab00 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1ab10 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
1ab20 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
1ab30 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
1ab40 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1ab50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ab60 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
1ab70 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1ab80 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1ab90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
1aba0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
1abb0 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
1abc0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1abd0 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
1abe0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1abf0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ac00 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74  _FTS3 /* automat
1ac10 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62  ically defined b
1ac20 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  y SQLITE_ENABLE_
1ac30 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64  FTS4 */.  if( !d
1ac40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ac50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ac60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ac70 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
1ac80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1ac90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1aca0 5f 45 4e 41 42 4c 45 5f 49 43 55 29 20 7c 7c 20  _ENABLE_ICU) || 
1acb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1acc0 4e 41 42 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41 54  NABLE_ICU_COLLAT
1acd0 49 4f 4e 53 29 0a 20 20 69 66 28 20 21 64 62 2d  IONS).  if( !db-
1ace0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1acf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ad00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1ad10 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
1ad20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1ad30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ad40 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
1ad50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1ad60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1ad70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ad80 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
1ad90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1ada0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1adb0 5f 44 42 50 41 47 45 5f 56 54 41 42 0a 20 20 69  _DBPAGE_VTAB.  i
1adc0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1add0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1ade0 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1adf0 20 73 71 6c 69 74 65 33 44 62 70 61 67 65 52 65   sqlite3DbpageRe
1ae00 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a  gister(db);.  }.
1ae10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ae20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53  QLITE_ENABLE_DBS
1ae30 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21  TAT_VTAB.  if( !
1ae40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ae50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1ae60 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1ae70 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74  ite3DbstatRegist
1ae80 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
1ae90 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1aea0 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20  E_ENABLE_JSON1. 
1aeb0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1aec0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1aed0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1aee0 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49   = sqlite3Json1I
1aef0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1af00 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1af10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54  TE_ENABLE_STMTVT
1af20 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
1af30 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1af40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1af50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
1af60 6d 74 56 74 61 62 49 6e 69 74 28 64 62 29 3b 0a  mtVtabInit(db);.
1af70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1af80 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
1af90 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
1afa0 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
1afb0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
1afc0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
1afd0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
1afe0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
1aff0 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
1b000 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
1b010 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
1b020 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
1b030 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
1b040 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
1b050 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1b060 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
1b070 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
1b080 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
1b090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
1b0a0 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
1b0b0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
1b0c0 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
1b0d0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
1b0e0 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
1b110 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
1b120 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
1b130 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
1b140 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
1b150 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
1b160 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
1b170 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
1b180 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
1b190 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b1a0 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
1b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b1c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b1d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
1b1e0 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
1b1f0 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
1b200 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
1b210 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
1b220 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
1b230 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69  .opendb_out:.  i
1b240 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
1b250 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
1b260 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
1b270 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
1b280 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
1b290 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
1b2a0 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
1b2b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b2c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
1b2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
1b2e0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
1b2f0 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
1b300 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1b310 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b320 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
1b330 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
1b340 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
1b350 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
1b360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b370 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1b380 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
1b390 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
1b3a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1b3b0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
1b3c0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1b3d0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
1b3e0 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e  ){.    /* Openin
1b3f0 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46  g a db handle. F
1b400 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
1b410 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a  is passed 0. */.
1b420 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
1b430 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b440 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b  nfig.pSqllogArg;
1b450 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1b460 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
1b470 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65  (pArg, db, zFile
1b480 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  name, 0);.  }.#e
1b490 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
1b4a0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
1b4b0 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  C).  if( rc==SQL
1b4c0 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33  ITE_OK ) sqlite3
1b4d0 43 6f 64 65 63 51 75 65 72 79 50 61 72 61 6d 65  CodecQueryParame
1b4e0 74 65 72 73 28 64 62 2c 20 30 2c 20 7a 4f 70 65  ters(db, 0, zOpe
1b4f0 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  n);.#endif.  sql
1b500 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29  ite3_free(zOpen)
1b510 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  ;.  return rc & 
1b520 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  0xff;.}.../*.** 
1b530 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1b540 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1b550 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
1b560 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b570 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1b580 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
1b590 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
1b5a0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
1b5b0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b5d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1b5e0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1b5f0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
1b600 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1b610 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
1b620 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
1b630 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1b640 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
1b650 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
1b660 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1b670 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
1b680 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b6a0 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
1b6b0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
1b6c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
1b6d0 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
1b6e0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1b6f0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
1b700 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
1b710 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
1b720 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
1b730 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b740 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
1b750 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1b760 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1b770 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
1b780 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1b790 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1b7a0 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
1b7b0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
1b7c0 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
1b7d0 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
1b7e0 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
1b7f0 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
1b800 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1b810 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
1b820 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b830 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b840 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
1b850 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1b860 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1b870 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
1b880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b890 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
1b8a0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1b8b0 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
1b8c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1b8d0 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
1b8e0 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
1b8f0 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
1b900 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
1b910 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
1b920 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
1b930 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
1b940 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
1b950 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
1b960 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
1b970 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
1b980 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
1b990 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1b9a0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
1b9b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1b9c0 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1b9d0 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1ba00 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1ba10 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1ba20 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
1ba30 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
1ba40 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
1ba50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ba60 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
1ba70 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
1ba80 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
1ba90 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
1baa0 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
1bab0 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
1bac0 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
1bad0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1bae0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1baf0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1bb00 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
1bb10 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
1bb20 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
1bb30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1bb40 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1bb50 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1bb60 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bb70 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1bb80 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1bb90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1bba0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1bbb0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1bbc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bbd0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1bbe0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1bbf0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1bc00 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1bc10 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1bc20 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
1bc30 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
1bc40 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1bc50 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
1bc60 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1bc70 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
1bc80 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1bc90 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1bca0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1bcb0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1bcc0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1bcd0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
1bce0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1bcf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bd00 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1bd10 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1bd20 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1bd30 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1bd40 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1bd50 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
1bd60 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
1bd70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1bd80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bd90 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1bda0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1bdb0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1bdc0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1bdd0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1bde0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1bdf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1be00 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1be10 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1be20 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
1be30 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
1be40 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
1be50 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1be60 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
1be70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1be80 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1be90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1bea0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1beb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bed0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1bee0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1bef0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1bf00 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1bf10 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1bf20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1bf30 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
1bf40 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1bf50 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1bf60 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
1bf70 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1bf80 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1bf90 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1bfa0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1bfb0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
1bfc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bfd0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1bfe0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1bff0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1c000 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1c010 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1c020 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1c030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c040 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1c050 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1c060 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1c070 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1c080 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c090 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1c0a0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1c0b0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1c0c0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1c0d0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1c0e0 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1c0f0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1c100 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1c110 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1c120 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1c130 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1c140 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1c150 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1c160 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1c170 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c180 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c190 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1c1a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1c1b0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1c1c0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1c1d0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1c1e0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1c1f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1c200 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1c210 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1c220 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1c230 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1c240 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1c250 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1c260 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1c270 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1c280 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1c290 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1c2a0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1c2b0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1c2c0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1c2d0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1c2e0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1c2f0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1c300 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1c310 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1c320 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1c330 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1c340 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1c350 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1c360 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1c370 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1c380 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1c390 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1c3a0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1c3b0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1c3c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c3d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1c3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c3f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1c400 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1c410 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1c420 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c430 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1c440 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1c450 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1c460 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1c470 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1c480 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1c490 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1c4a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1c4b0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1c4c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c4d0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1c4e0 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1c4f0 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1c500 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1c510 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1c520 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1c530 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c540 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1c550 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1c560 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1c570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1c580 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1c590 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c5a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1c5b0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1c5c0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1c5d0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1c5e0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1c5f0 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1c600 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1c610 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1c620 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c630 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1c650 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c660 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1c670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c680 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1c690 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c6a0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1c6b0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1c6c0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1c6d0 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1c6e0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1c6f0 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1c700 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1c710 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1c720 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1c730 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1c740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c750 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1c760 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1c770 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1c780 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c790 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1c7a0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1c7b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c7c0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1c7d0 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1c7e0 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1c7f0 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1c800 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1c810 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1c820 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1c830 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1c840 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1c850 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1c860 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1c870 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1c880 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1c890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1c8a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1c8b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1c8c0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1c8d0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1c8e0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1c8f0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1c900 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1c910 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1c920 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c930 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1c940 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1c950 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1c960 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1c970 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1c980 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1c990 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73  E_NOMEM and poss
1c9a0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1c9b0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1c9c0 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1c9d0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1c9e0 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1c9f0 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1ca00 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1ca10 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1ca20 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1ca30 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1ca40 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1ca50 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1ca60 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1ca70 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1ca80 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1ca90 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1caa0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1cab0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1cac0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1cad0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1cae0 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 69  te3ReportError(i
1caf0 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e  nt iErr, int lin
1cb00 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eno, const char 
1cb10 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
1cb20 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73  e3_log(iErr, "%s
1cb30 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1cb40 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1cb50 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69         zType, li
1cb60 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
1cb70 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
1cb80 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69  return iErr;.}.i
1cb90 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1cba0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
1cbb0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1cbc0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cbd0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1cbe0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1cbf0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1cc00 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1cc10 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72  o, "database cor
1cc20 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74  ruption");.}.int
1cc30 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1cc40 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1cc50 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1cc60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1cc70 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1cc80 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1cc90 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d  rtError(SQLITE_M
1cca0 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22  ISUSE, lineno, "
1ccb0 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20  misuse");.}.int 
1ccc0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
1ccd0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1cce0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1ccf0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1cd00 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1cd10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1cd20 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1cd30 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f  CANTOPEN, lineno
1cd40 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  , "cannot open f
1cd50 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20  ile");.}.#ifdef 
1cd60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
1cd70 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 50   sqlite3CorruptP
1cd80 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  gnoError(int lin
1cd90 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  eno, Pgno pgno){
1cda0 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30 30  .  char zMsg[100
1cdb0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1cdc0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73  rintf(sizeof(zMs
1cdd0 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61 62  g), zMsg, "datab
1cde0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 70  ase corruption p
1cdf0 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a  age %d", pgno);.
1ce00 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1ce10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ce20 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1ce30 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1ce40 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f  tError(SQLITE_CO
1ce50 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a  RRUPT, lineno, z
1ce60 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Msg);.}.int sqli
1ce70 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  te3NomemError(in
1ce80 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1ce90 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1cea0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1ceb0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1cec0 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1ced0 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  r(SQLITE_NOMEM, 
1cee0 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a  lineno, "OOM");.
1cef0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65  }.int sqlite3Ioe
1cf00 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74  rrnomemError(int
1cf10 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1cf20 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1cf30 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1cf40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1cf50 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1cf60 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  (SQLITE_IOERR_NO
1cf70 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f  MEM, lineno, "I/
1cf80 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d  O OOM error");.}
1cf90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1cfa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1cfb0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
1cfc0 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
1cfd0 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
1cfe0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1cff0 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
1d000 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
1d010 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
1d020 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
1d030 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
1d040 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
1d050 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
1d060 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
1d070 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
1d080 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
1d090 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
1d0a0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
1d0b0 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
1d0c0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1d0d0 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
1d0e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1d0f0 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
1d100 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
1d110 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
1d120 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1d130 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
1d140 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
1d150 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
1d160 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tails..*/.int sq
1d170 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
1d180 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
1d190 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1d1b0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1d1c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1d1d0 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
1d1e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
1d1f0 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
1d200 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
1d210 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
1d220 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
1d230 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1d240 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
1d250 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
1d260 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
1d270 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
1d280 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
1d290 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
1d2a0 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
1d2b0 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
1d2c0 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
1d2d0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
1d2e0 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d300 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1d310 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1d320 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
1d330 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
1d340 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
1d350 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1d360 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
1d370 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
1d380 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
1d390 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1d3a0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
1d3b0 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
1d3c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1d3d0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
1d3e0 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
1d3f0 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
1d400 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
1d410 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72  iCol = 0;.  char
1d420 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
1d430 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
1d440 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
1d450 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
1d460 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
1d470 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
1d480 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
1d490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d4a0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1d4b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1d4c0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1d4d0 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  || zTableName==0
1d4e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d4f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1d500 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1d510 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
1d520 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
1d530 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
1d540 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1d550 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1d560 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
1d570 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
1d580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1d590 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
1d5a0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1d5b0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
1d5c0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1d5d0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
1d5e0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
1d5f0 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
1d600 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1d610 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
1d620 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1d630 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
1d640 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
1d650 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
1d660 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1d670 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
1d680 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
1d690 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
1d6a0 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c  ed */.  if( zCol
1d6b0 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  umnName==0 ){.  
1d6c0 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65    /* Query for e
1d6d0 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c  xistance of tabl
1d6e0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73  e only */.  }els
1d6f0 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
1d700 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
1d710 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
1d720 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
1d730 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
1d740 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
1d750 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
1d760 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
1d770 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
1d780 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d790 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
1d7a0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1d7b0 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
1d7c0 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  d(pTab) && sqlit
1d7d0 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
1d7e0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1d7f0 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
1d800 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  PKey;.        pC
1d810 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26  ol = iCol>=0 ? &
1d820 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1d830 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 0;.      }els
1d840 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
1d850 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1d860 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1d870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d880 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1d890 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
1d8a0 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
1d8b0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
1d8c0 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
1d8d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
1d8e0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1d8f0 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
1d900 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
1d910 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
1d920 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
1d930 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1d940 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
1d950 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
1d960 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
1d970 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
1d980 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
1d990 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
1d9a0 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
1d9b0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
1d9c0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1d9d0 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
1d9e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
1d9f0 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
1da00 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
1da10 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
1da20 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
1da30 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
1da40 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
1da50 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
1da60 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
1da70 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
1da80 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
1da90 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
1daa0 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
1dab0 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ,0);.    zCollSe
1dac0 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
1dad0 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
1dae0 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
1daf0 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1db00 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
1db10 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
1db20 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
1db30 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
1db40 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
1db50 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1db60 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
1db70 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1db80 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
1db90 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
1dba0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
1dbb0 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
1dbc0 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
1dbd0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1dbe0 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  ARY;.  }..error_
1dbf0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
1dc00 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1dc10 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
1dc20 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
1dc30 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
1dc40 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
1dc50 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
1dc60 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
1dc70 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
1dc80 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
1dc90 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
1dca0 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
1dcb0 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
1dcc0 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
1dcd0 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
1dce0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1dcf0 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
1dd00 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
1dd10 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
1dd20 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
1dd30 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
1dd40 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
1dd50 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
1dd60 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
1dd70 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
1dd80 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
1dd90 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
1dda0 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
1ddb0 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
1ddc0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
1ddd0 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
1dde0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ddf0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
1de00 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1de10 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
1de20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
1de30 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
1de40 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
1de50 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
1de60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1de70 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
1de80 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
1de90 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
1dea0 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
1deb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1dec0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1ded0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1dee0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1def0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1df00 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1df10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1df20 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1df30 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1df40 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1df50 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1df60 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1df70 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1df80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1df90 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1dfa0 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1dfb0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1dfc0 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1dfd0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1dfe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1dff0 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1e000 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1e010 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1e020 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1e030 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1e040 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1e050 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1e060 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1e070 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1e080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e090 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1e0a0 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1e0b0 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1e0c0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1e0d0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1e0e0 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1e0f0 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1e100 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1e110 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1e120 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1e130 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1e140 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e150 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1e160 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1e170 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1e180 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1e190 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1e1a0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1e1b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1e1c0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e1d0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1e1e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e1f0 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1e200 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1e210 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1e220 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1e230 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1e240 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1e250 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1e260 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1e270 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1e280 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1e290 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1e2a0 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1e2b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1e2c0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1e2d0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1e2e0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1e2f0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1e300 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1e310 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e320 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1e330 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1e340 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1e350 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1e360 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1e370 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1e380 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e390 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1e3a0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e3b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1e3c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1e3d0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1e3e0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1e3f0 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1e400 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1e410 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1e420 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1e430 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1e440 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1e450 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1e460 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1e470 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1e480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e490 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1e4a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
1e4b0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1e4c0 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a   *(sqlite3_vfs**
1e4d0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1e4e0 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b  agerVfs(pPager);
1e4f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e500 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1e510 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1e520 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f  FCNTL_JOURNAL_PO
1e530 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1e540 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1e550 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1e560 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67  gerJrnlFile(pPag
1e570 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1e580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e590 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1e5a0 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
1e5b0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
1e5c0 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29  *(unsigned int*)
1e5d0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1e5e0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70  gerDataVersion(p
1e5f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1e600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e620 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1e630 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
1e640 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pArg);.    }.  
1e650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e660 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e670 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e680 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1e690 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1e6b0 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1e6c0 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1e6d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e6e0 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1e6f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1e700 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1e710 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53  NTESTABLE.  UNUS
1e720 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29  ED_PARAMETER(op)
1e730 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73  ;.#else.  va_lis
1e740 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1e750 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
1e760 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
1e770 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
1e780 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1e790 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
1e7a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e7b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1e7c0 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
1e7d0 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
1e7e0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1e7f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e800 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
1e810 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1e820 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
1e830 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
1e840 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
1e850 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
1e860 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
1e870 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
1e880 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
1e890 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
1e8a0 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
1e8b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e8c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e8d0 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
1e8e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1e8f0 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
1e900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e910 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1e920 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e930 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e940 4c 5f 50 52 4e 47 5f 53 45 45 44 2c 20 69 6e 74  L_PRNG_SEED, int
1e950 20 78 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29   x, sqlite3 *db)
1e960 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e970 43 6f 6e 74 72 6f 6c 20 74 68 65 20 73 65 65 64  Control the seed
1e980 20 66 6f 72 20 74 68 65 20 70 73 65 75 64 6f 2d   for the pseudo-
1e990 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
1e9a0 6e 65 72 61 74 6f 72 20 28 50 52 4e 47 29 20 74  nerator (PRNG) t
1e9b0 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 62 75  hat.    ** is bu
1e9c0 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e  ilt into SQLite.
1e9d0 20 20 43 61 73 65 73 3a 0a 20 20 20 20 2a 2a 0a    Cases:.    **.
1e9e0 20 20 20 20 2a 2a 20 20 20 20 78 21 3d 30 20 26      **    x!=0 &
1e9f0 26 20 64 62 21 3d 30 20 20 20 20 20 20 20 53 65  & db!=0       Se
1ea00 65 64 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  ed the PRNG to t
1ea10 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1ea20 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20   of the.    **  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 73 63 68 65 6d 61 20 63 6f 6f        schema coo
1ea50 6b 69 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  kie in the main 
1ea60 64 61 74 61 62 61 73 65 20 66 6f 72 20 64 62 2c  database for db,
1ea70 20 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   or.    **      
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 78 20 69 66 20 74 68 65 20 73 63 68 65 6d    x if the schem
1eaa0 61 20 63 6f 6f 6b 69 65 20 69 73 20 7a 65 72 6f  a cookie is zero
1eab0 2e 20 20 54 68 69 73 20 63 61 73 65 0a 20 20 20  .  This case.   
1eac0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1ead0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63 6f             is co
1eae0 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1eaf0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 75  with database fu
1eb00 7a 7a 65 72 73 0a 20 20 20 20 2a 2a 20 20 20 20  zzers.    **    
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 61 73 20 69 74 20 61 6c 6c 6f 77 73      as it allows
1eb30 20 74 68 65 20 66 75 7a 7a 65 72 20 73 6f 6d 65   the fuzzer some
1eb40 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 20 74 68   control over th
1eb50 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 74 68 65 20 50 52 4e 47 20 73 65 65 64 2e 0a 20  the PRNG seed.. 
1eb80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1eb90 78 21 3d 30 20 26 26 20 64 62 3d 3d 30 20 20 20  x!=0 && db==0   
1eba0 20 20 20 20 53 65 65 64 20 74 68 65 20 50 52 4e      Seed the PRN
1ebb0 47 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  G to the value o
1ebc0 66 20 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  f x..    **.    
1ebd0 2a 2a 20 20 20 20 78 3d 3d 30 20 26 26 20 64 62  **    x==0 && db
1ebe0 3d 3d 30 20 20 20 20 20 20 20 52 65 76 65 72 74  ==0       Revert
1ebf0 20 74 6f 20 64 65 66 61 75 6c 74 20 62 65 68 61   to default beha
1ec00 76 69 6f 72 20 6f 66 20 75 73 69 6e 67 20 74 68  vior of using th
1ec10 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
1ec40 6f 64 20 6f 6e 20 74 68 65 20 70 72 69 6d 61 72  od on the primar
1ec50 79 20 56 46 53 2e 0a 20 20 20 20 2a 2a 0a 20 20  y VFS..    **.  
1ec60 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 2d 63    ** This test-c
1ec70 6f 6e 74 72 6f 6c 20 61 6c 73 6f 20 72 65 73 65  ontrol also rese
1ec80 74 73 20 74 68 65 20 50 52 4e 47 20 73 6f 20 74  ts the PRNG so t
1ec90 68 61 74 20 74 68 65 20 6e 65 77 20 73 65 65 64  hat the new seed
1eca0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
1ecb0 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 65 78  used for the nex
1ecc0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
1ecd0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 2e 0a  3_randomness()..
1ece0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ecf0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ed00 50 52 4e 47 5f 53 45 45 44 3a 20 7b 0a 20 20 20  PRNG_SEED: {.   
1ed10 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1ed20 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1ed30 20 20 69 6e 74 20 79 3b 0a 20 20 20 20 20 20 73    int y;.      s
1ed40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1ed50 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1ed60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ed70 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44   db==0 || db->aD
1ed80 62 5b 30 5d 2e 70 53 63 68 65 6d 61 21 3d 30 20  b[0].pSchema!=0 
1ed90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 20  );.      if( db 
1eda0 26 26 20 28 79 20 3d 20 64 62 2d 3e 61 44 62 5b  && (y = db->aDb[
1edb0 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  0].pSchema->sche
1edc0 6d 61 5f 63 6f 6f 6b 69 65 29 21 3d 30 20 29 7b  ma_cookie)!=0 ){
1edd0 20 78 20 3d 20 79 3b 20 7d 0a 20 20 20 20 20 20   x = y; }.      
1ede0 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 50  sqlite3Config.iP
1edf0 72 6e 67 53 65 65 64 20 3d 20 78 3b 0a 20 20 20  rngSeed = x;.   
1ee00 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1ee10 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20  mness(0,0);.    
1ee20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ee30 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ee40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ee50 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
1ee60 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
1ee70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
1ee80 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
1ee90 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
1eea0 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
1eeb0 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
1eec0 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
1eed0 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1eee0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1eef0 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
1ef00 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
1ef10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
1ef20 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
1ef30 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
1ef40 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
1ef50 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
1ef60 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1ef70 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
1ef80 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1ef90 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
1efa0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1efb0 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
1efc0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
1efd0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1efe0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
1eff0 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
1f000 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
1f010 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1f020 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
1f030 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
1f040 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1f050 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1f060 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1f070 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78  FAULT_INSTALL, x
1f080 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a  Callback).    **
1f090 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20  .    ** Arrange 
1f0a0 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62  to invoke xCallb
1f0b0 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73  ack() whenever s
1f0c0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29  qlite3FaultSim()
1f0d0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20   is called,.    
1f0e0 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20  ** if xCallback 
1f0f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1f100 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20   **.    ** As a 
1f110 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c  test of the faul
1f120 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68  t simulator mech
1f130 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71  anism itself, sq
1f140 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1f150 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  .    ** is calle
1f160 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
1f170 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74  ter installing t
1f180 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20  he new callback 
1f190 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20  and the return. 
1f1a0 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d     ** value from
1f1b0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1f1c0 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  (0) becomes the 
1f1d0 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20  return from.    
1f1e0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
1f1f0 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a  control()..    *
1f200 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1f210 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
1f220 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20  _INSTALL: {.    
1f230 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
1f240 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
1f250 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
1f260 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
1f270 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
1f280 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
1f290 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
1f2a0 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
1f2b0 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1f2c0 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1f2d0 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20   int(*)(int));. 
1f2e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
1f2f0 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43  pedef int(*TESTC
1f300 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69  ALLBACKFUNC_t)(i
1f310 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1f320 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1f330 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
1f340 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41  a_arg(ap, TESTCA
1f350 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20  LLBACKFUNC_t);. 
1f360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f370 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20  3FaultSim(0);.  
1f380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f390 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f3a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f3b0 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
1f3c0 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
1f3d0 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
1f3e0 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
1f3f0 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
1f400 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
1f410 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1f420 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
1f430 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
1f440 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f450 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
1f460 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
1f470 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1f480 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
1f490 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
1f4a0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1f4b0 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
1f4c0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1f4d0 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
1f4e0 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
1f4f0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1f500 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1f510 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
1f520 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1f530 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
1f540 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
1f550 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
1f560 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
1f570 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f580 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1f590 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1f5a0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1f5b0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1f5c0 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
1f5d0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1f5e0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
1f5f0 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
1f600 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
1f610 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
1f620 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
1f630 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
1f640 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
1f650 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
1f660 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
1f670 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
1f680 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1f690 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
1f6a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
1f6b0 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
1f6c0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1f6d0 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
1f6e0 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
1f6f0 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
1f700 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
1f710 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
1f720 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1f730 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
1f740 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
1f750 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
1f760 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
1f770 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
1f780 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68   deleterious beh
1f790 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
1f7a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1f7b0 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1f7c0 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  YTE: {.      rc 
1f7d0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
1f7e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f7f0 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a  MIT_WSD.      {.
1f800 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1f810 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
1f820 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
1f830 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  d int);.        
1f840 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c  if( newVal ) sql
1f850 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20  ite3PendingByte 
1f860 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20  = newVal;.      
1f870 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1f880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1f890 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1f8a0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f8b0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f8c0 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a  _ASSERT, int X).
1f8d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f8e0 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1f8f0 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1f900 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
1f910 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  r or not.    ** 
1f920 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61  assert() was ena
1f930 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1f940 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74  time.  If X is t
1f950 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  rue and assert()
1f960 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c  .    ** is enabl
1f970 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1f980 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75  urn value is tru
1f990 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1f9a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65   and.    ** asse
1f9b0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1f9c0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1f9d0 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1f9e0 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a    If X is.    **
1f9f0 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1fa00 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  t() is enabled, 
1fa10 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69  then the asserti
1fa20 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65  on fires and the
1fa30 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1fa40 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73  aborts.  If X is
1fa50 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1fa60 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1fa70 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1fa80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1fa90 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1faa0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1fab0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b  STCTRL_ASSERT: {
1fac0 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  .      volatile 
1fad0 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
1fae0 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d   assert( /*side-
1faf0 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20  effects-ok*/ (x 
1fb00 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1fb10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
1fb20 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
1fb30 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1fb40 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1fb50 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fb60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1fb70 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
1fb80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1fb90 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1fba0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1fbb0 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
1fbc0 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
1fbd0 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
1fbe0 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
1fbf0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
1fc00 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1fc10 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
1fc20 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69 73  LWAYS(X) if X is
1fc30 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58   true, or 0 if X
1fc40 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1fc50 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1fc60 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1fc70 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1fc80 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1fc90 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1fca0 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1fcb0 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1fcc0 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1fcd0 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1fce0 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1fcf0 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1fd00 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1fd10 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1fd20 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1fd30 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1fd40 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1fd50 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1fd60 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1fd70 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1fd80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1fd90 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1fda0 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1fdb0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1fdc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1fdd0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1fde0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1fdf0 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1fe00 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1fe10 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1fe20 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1fe30 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1fe40 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1fe50 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1fe60 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1fe70 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1fe80 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1fe90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fea0 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1feb0 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1fec0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1fed0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1fee0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1fef0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ff00 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ff10 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1ff20 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1ff30 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1ff40 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1ff50 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1ff60 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1ff70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1ff80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ff90 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1ffa0 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1ffb0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1ffc0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1ffd0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1ffe0 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1fff0 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
20000 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
20010 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
20020 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
20030 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
20040 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
20050 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
20060 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20070 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20080 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
20090 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
200a0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
200b0 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29   = x ? ALWAYS(x)
200c0 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
200d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
200e0 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
200f0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20100 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
20110 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
20120 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
20130 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
20140 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
20150 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
20160 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
20170 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
20180 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
20190 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
201a0 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
201b0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
201c0 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
201d0 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
201e0 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
201f0 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
20200 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
20210 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
20220 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
20230 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
20240 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
20250 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
20260 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
20270 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
20280 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
20290 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
202a0 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
202b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
202c0 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
202d0 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
202e0 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
202f0 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
20300 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20310 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
20320 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20330 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
20340 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
20350 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
20360 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
20370 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
20380 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
20390 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
203a0 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
203b0 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
203c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
203d0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
203e0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
203f0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
20400 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
20410 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
20420 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
20430 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
20440 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
20450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20460 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
20470 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
20480 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
20490 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
204a0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
204b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
204c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
204d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
204e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
204f0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
20500 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
20510 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
20520 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
20530 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
20540 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
20550 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
20560 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
20570 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
20580 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
20590 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
205a0 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
205b0 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
205c0 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
205d0 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
205e0 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
205f0 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
20600 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
20610 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
20620 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
20630 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
20640 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
20650 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
20660 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
20670 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
20680 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
20690 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
206a0 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
206b0 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
206c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
206d0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
206e0 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
206f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
20700 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
20710 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
20720 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
20730 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
20740 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
20750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20760 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
20770 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20780 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
20790 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
207a0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
207b0 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
207c0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
207d0 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65 71 75 65  n-zero, subseque
207e0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
207f0 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20 61  ltime().    ** a
20800 6e 64 20 69 74 73 20 76 61 72 69 61 6e 74 73 20  nd its variants 
20810 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
20820 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68 69  s zero, undo thi
20830 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
20840 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20850 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
20860 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
20870 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20880 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
20890 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
208a0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
208b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
208c0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
208d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
208e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
208f0 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e 74  ERNAL_FUNCS, int
20900 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
20910 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
20920 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
20930 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c 2d  -zero, internal-
20940 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75 6e  use-only SQL fun
20950 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61 72  ctions.    ** ar
20960 65 20 76 69 73 69 62 6c 65 20 74 6f 20 6f 72 64  e visible to ord
20970 69 6e 61 72 79 20 53 51 4c 2e 20 20 54 68 69 73  inary SQL.  This
20980 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 74   is useful for t
20990 65 73 74 69 6e 67 20 62 75 74 20 69 73 0a 20 20  esting but is.  
209a0 20 20 2a 2a 20 75 6e 73 61 66 65 20 62 65 63 61    ** unsafe beca
209b0 75 73 65 20 69 6e 76 61 6c 69 64 20 70 61 72 61  use invalid para
209c0 6d 65 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20  meters to those 
209d0 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c  internal-use-onl
209e0 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  y functions.    
209f0 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  ** can result in
20a00 20 63 72 61 73 68 65 73 20 6f 72 20 73 65 67 66   crashes or segf
20a10 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aults..    */.  
20a20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
20a30 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f  STCTRL_INTERNAL_
20a40 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  FUNCTIONS: {.   
20a50 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
20a60 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c  Config.bInternal
20a70 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f 61  Functions = va_a
20a80 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
20a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20aa0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20ab0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20ac0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
20ad0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
20ae0 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
20af0 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
20b00 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
20b10 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
20b20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
20b30 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
20b40 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
20b50 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
20b60 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
20b70 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
20b80 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
20b90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
20ba0 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
20bb0 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
20bc0 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
20bd0 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
20be0 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
20bf0 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
20c00 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
20c10 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
20c20 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
20c30 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
20c40 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
20c50 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
20c60 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
20c70 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20c80 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
20c90 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
20ca0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
20cb0 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
20cc0 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
20cd0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
20ce0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20cf0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
20d00 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20d10 54 45 53 54 43 54 52 4c 5f 45 58 54 52 41 5f 53  TESTCTRL_EXTRA_S
20d20 43 48 45 4d 41 5f 43 48 45 43 4b 53 2c 20 69 6e  CHEMA_CHECKS, in
20d30 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
20d40 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
20d50 20 66 6c 61 67 20 74 68 61 74 20 63 61 75 73 65   flag that cause
20d60 73 20 53 51 4c 69 74 65 20 74 6f 20 76 65 72 69  s SQLite to veri
20d70 66 79 20 74 68 61 74 20 74 79 70 65 2c 20 6e 61  fy that type, na
20d80 6d 65 2c 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  me,.    ** and t
20d90 62 6c 5f 6e 61 6d 65 20 66 69 65 6c 64 73 20 6f  bl_name fields o
20da0 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
20db0 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ter table.  This
20dc0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20   is normally.   
20dd0 20 2a 2a 20 6f 6e 2c 20 62 75 74 20 69 74 20 69   ** on, but it i
20de0 73 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 66  s sometimes usef
20df0 75 6c 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  ul to turn it of
20e00 66 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 20  f for testing.. 
20e10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
20e20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45  QLITE_TESTCTRL_E
20e30 58 54 52 41 5f 53 43 48 45 4d 41 5f 43 48 45 43  XTRA_SCHEMA_CHEC
20e40 4b 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  KS: {.      sqli
20e50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e60 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65 63  bExtraSchemaChec
20e70 6b 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ks = va_arg(ap, 
20e80 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
20e90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20ea0 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68 6f   Set the thresho
20eb0 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f 4f  ld at which OP_O
20ec0 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65 73  nce counters res
20ed0 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e  et back to zero.
20ee0 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61 75  .    ** By defau
20ef0 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66 66  lt this is 0x7ff
20f00 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62 69  ffffe (over 2 bi
20f10 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61 74  llion), but that
20f20 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a   value is.    **
20f30 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73 74   too big to test
20f40 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c 65   in a reasonable
20f50 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c   amount of time,
20f60 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c   so this control
20f70 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69   is.    ** provi
20f80 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d 61  ded to set a sma
20f90 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72 65  ll and easily re
20fa0 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76 61  achable reset va
20fb0 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
20fc0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
20fd0 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f  CTRL_ONCE_RESET_
20fe0 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20  THRESHOLD: {.   
20ff0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
21000 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73 65  Config.iOnceRese
21010 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f  tThreshold = va_
21020 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
21030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21040 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
21050 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
21060 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
21070 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78  VDBE_COVERAGE, x
21080 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a  Callback, ptr);.
21090 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
210a0 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65 72  t the VDBE cover
210b0 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  age callback fun
210c0 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61  ction to xCallba
210d0 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20  ck with context 
210e0 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
210f0 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ptr..    */.    
21100 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
21110 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
21120 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  GE: {.#ifdef SQL
21130 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
21140 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  E.      typedef 
21150 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61  void (*branch_ca
21160 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75 6e  llback)(void*,un
21170 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20 20  signed int,.    
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2c    unsigned char,
211b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b 0a  unsigned char);.
211c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
211d0 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42  balConfig.xVdbeB
211e0 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ranch = va_arg(a
211f0 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  p,branch_callbac
21200 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
21210 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56  3GlobalConfig.pV
21220 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76  dbeBranchArg = v
21230 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b  a_arg(ap,void*);
21240 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
21250 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21260 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
21270 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
21280 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
21290 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29  _MMAP, db, nMax)
212a0 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ; */.    case SQ
212b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
212c0 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20  RTER_MMAP: {.   
212d0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
212e0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
212f0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
21300 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
21310 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
21320 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
21330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
21340 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
21350 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
21360 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20  CTRL_ISINIT);.  
21370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75    **.    ** Retu
21380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
21390 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20  SQLite has been 
213a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
213b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a  SQLITE_ERROR if.
213c0 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20      ** not..    
213d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
213e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
213f0 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IT: {.      if( 
21400 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21410 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20  fig.isInit==0 ) 
21420 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
21430 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
21440 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
21450 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
21460 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
21470 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
21480 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c  , dbName, onOff,
21490 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20   tnum);.    **. 
214a0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
214b0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20  control is used 
214c0 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74  to create impost
214d0 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22  er tables.  "db"
214e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   is a pointer.  
214f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
21500 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
21510 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20    dbName is the 
21520 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65  database name (e
21530 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20  x: "main" or.   
21540 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63   ** "temp") whic
21550 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74  h will receive t
21560 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f  he imposter.  "o
21570 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f  nOff" turns impo
21580 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20  ster mode on.   
21590 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e   ** or off.  "tn
215a0 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20  um" is the root 
215b0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
215c0 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ee to which the 
215d0 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20  imposter.    ** 
215e0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  table should con
215f0 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nect..    **.   
21600 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73   ** Enable impos
21610 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68  ter mode only wh
21620 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  en the schema ha
21630 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
21640 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20  arsed.  Then.   
21650 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65   ** run a single
21660 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
21670 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  atement to const
21680 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65  ruct the imposte
21690 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a  r table in.    *
216a0 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68  * the parsed sch
216b0 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20  ema.  Then turn 
216c0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61  imposter mode ba
216d0 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20  ck off again..  
216e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f    **.    ** If o
216f0 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d  nOff==0 and tnum
21700 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  >0 then reset th
21710 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c  e schema for all
21720 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73   databases, caus
21730 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ing.    ** the s
21740 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61  chema to be repa
21750 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  rsed the next ti
21760 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  me it is needed.
21770 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20    This has the. 
21780 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20     ** effect of 
21790 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f  erasing all impo
217a0 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20  ster tables..   
217b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
217c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
217d0 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  OSTER: {.      s
217e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
217f0 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
21800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21810 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
21820 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64  >mutex);.      d
21830 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71  b->init.iDb = sq
21840 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
21850 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f  db, va_arg(ap,co
21860 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
21870 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
21880 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f   = db->init.impo
21890 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61  sterTable = va_a
218a0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
218b0 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e    db->init.newTn
218c0 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  um = va_arg(ap,i
218d0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  nt);.      if( d
218e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
218f0 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
21900 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  num>0 ){.       
21910 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
21920 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
21930 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ion(db);.      }
21940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
21950 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
21960 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
21970 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
21980 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47  efined(YYCOVERAG
21990 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  E).    /*  sqlit
219a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
219b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
219c0 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c  PARSER_COVERAGE,
219d0 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20 20   FILE *out).    
219e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
219f0 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c  est control (onl
21a00 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  y available when
21a10 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
21a20 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  led with.    ** 
21a30 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77 72  -DYYCOVERAGE) wr
21a40 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f 6e  ites a report on
21a50 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73 68  to "out" that sh
21a60 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  ows all.    ** s
21a70 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63  tate/lookahead c
21a80 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20 74  ombinations in t
21a90 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65 20  he parser state 
21aa0 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20 77  machine.    ** w
21ab0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 65  hich are never e
21ac0 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61 6e  xercised.  If an
21ad0 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73 65  y state is misse
21ae0 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  d, make the.    
21af0 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53  ** return code S
21b00 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 20  QLITE_ERROR..   
21b10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
21b20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52  ITE_TESTCTRL_PAR
21b30 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  SER_COVERAGE: {.
21b40 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
21b50 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49 4c  = va_arg(ap, FIL
21b60 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  E*);.      if( s
21b70 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76 65  qlite3ParserCove
21b80 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20 3d  rage(out) ) rc =
21b90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21bb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
21bc0 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29 20  ned(YYCOVERAGE) 
21bd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  */..    /*  sqli
21be0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
21bf0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
21c00 5f 52 45 53 55 4c 54 5f 49 4e 54 52 45 41 4c 2c  _RESULT_INTREAL,
21c10 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
21c20 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  *);.    **.    *
21c30 2a 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74  * This test-cont
21c40 72 6f 6c 20 63 61 75 73 65 73 20 74 68 65 20 6d  rol causes the m
21c50 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
21c60 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
21c70 29 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74  ) value.    ** t
21c80 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  o be interpreted
21c90 20 61 73 20 61 20 4d 45 4d 5f 49 6e 74 52 65 61   as a MEM_IntRea
21ca0 6c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20  l instead of as 
21cb0 61 6e 20 4d 45 4d 5f 49 6e 74 2e 20 20 4e 6f 72  an MEM_Int.  Nor
21cc0 6d 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 4d 45  mally,.    ** ME
21cd0 4d 5f 49 6e 74 52 65 61 6c 20 76 61 6c 75 65 73  M_IntReal values
21ce0 20 6f 6e 6c 79 20 61 72 69 73 65 20 64 75 72 69   only arise duri
21cf0 6e 67 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65  ng an INSERT ope
21d00 72 61 74 69 6f 6e 20 6f 66 20 69 6e 74 65 67 65  ration of intege
21d10 72 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  r.    ** values 
21d20 69 6e 74 6f 20 61 20 52 45 41 4c 20 63 6f 6c 75  into a REAL colu
21d30 6d 6e 2c 20 73 6f 20 74 68 65 79 20 63 61 6e 20  mn, so they can 
21d40 62 65 20 63 68 61 6c 6c 65 6e 67 69 6e 67 20 74  be challenging t
21d50 6f 20 74 65 73 74 2e 20 20 54 68 69 73 0a 20 20  o test.  This.  
21d60 20 20 2a 2a 20 74 65 73 74 2d 63 6f 6e 74 72 6f    ** test-contro
21d70 6c 20 65 6e 61 62 6c 65 73 20 75 73 20 74 6f 20  l enables us to 
21d80 77 72 69 74 65 20 61 6e 20 69 6e 74 72 65 61 6c  write an intreal
21d90 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
21da0 74 68 61 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20  that can.    ** 
21db0 69 6e 6a 65 63 74 20 61 6e 20 69 6e 74 72 65 61  inject an intrea
21dc0 6c 28 29 20 76 61 6c 75 65 20 61 74 20 61 72 62  l() value at arb
21dd0 69 74 72 61 72 79 20 70 6c 61 63 65 73 20 69 6e  itrary places in
21de0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
21df0 74 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 65  t,.    ** for te
21e00 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
21e10 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
21e20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
21e30 52 45 53 55 4c 54 5f 49 4e 54 52 45 41 4c 3a 20  RESULT_INTREAL: 
21e40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
21e50 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  context *pCtx = 
21e60 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
21e70 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20  e3_context*);.  
21e80 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c      sqlite3Resul
21e90 74 49 6e 74 52 65 61 6c 28 70 43 74 78 29 3b 0a  tIntReal(pCtx);.
21ea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21eb0 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
21ec0 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
21ed0 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
21ee0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
21ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
21f00 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74  s a utility rout
21f10 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56  ine, useful to V
21f20 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
21f30 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a  ns, that checks.
21f40 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64  ** to see if a d
21f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73  atabase file was
21f60 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74   a URI that cont
21f70 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63  ained a specific
21f80 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d   query .** param
21f90 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20  eter, and if so 
21fa0 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  obtains the valu
21fb0 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70  e of the query p
21fc0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
21fd0 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
21fe0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
21ff0 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70  lename pointer p
22000 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78  assed into the x
22010 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Open().** method
22020 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d   of a VFS implem
22030 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a  entation.  The z
22040 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69  Param argument i
22050 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
22060 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  e.** query param
22070 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54  eter we seek.  T
22080 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22090 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  rns the value of
220a0 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70   the zParam.** p
220b0 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65  arameter if it e
220c0 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70  xists.  If the p
220d0 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f  arameter does no
220e0 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f  t exist, this ro
220f0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
22100 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
22110 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
22120 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
22130 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  meter(const char
22140 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
22150 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29  st char *zParam)
22160 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  {.  if( zFilenam
22170 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d  e==0 || zParam==
22180 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22190 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
221a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
221b0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
221c0 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
221d0 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
221e0 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
221f0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
22200 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
22210 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
22220 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
22230 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
22240 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
22250 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
22260 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
22270 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
22280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22290 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
222a0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
222b0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
222c0 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
222d0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
222e0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
222f0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
22300 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
22310 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
22320 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
22330 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
22340 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
22350 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
22360 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
22370 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
22380 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
22390 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
223a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
223b0 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
223c0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
223d0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
223e0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
223f0 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
22400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
22410 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
22420 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
22430 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
22440 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
22450 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
22460 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
22470 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
22480 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
22490 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
224a0 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
224b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
224c0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
224d0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
224e0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
224f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
22500 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
22510 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
22520 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20 29  oI64(z, &v)==0 )
22530 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b  {.    bDflt = v;
22540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44  .  }.  return bD
22550 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
22560 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70  turn the Btree p
22570 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65  ointer identifie
22580 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52  d by zDbName.  R
22590 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
225a0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65  t found..*/.Btre
225b0 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65  e *sqlite3DbName
225c0 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20  ToBtree(sqlite3 
225d0 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
225e0 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
225f0 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f   iDb = zDbName ?
22600 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
22610 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20  me(db, zDbName) 
22620 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 44  : 0;.  return iD
22630 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44  b<0 ? 0 : db->aD
22640 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f  b[iDb].pBt;.}../
22650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22660 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
22670 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
22680 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
22690 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
226a0 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
226b0 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
226c0 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
226d0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
226e0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
226f0 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
22700 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
22710 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
22720 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
22730 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
22740 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
22750 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
22760 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
22770 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
22780 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
22790 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
227a0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
227b0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
227c0 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
227d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
227e0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
227f0 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
22800 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
22810 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
22820 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
22830 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
22840 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
22850 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
22860 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
22870 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
22880 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
22890 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
228a0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
228b0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
228c0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
228d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
228e0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
228f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
22900 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
22910 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
22920 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
22930 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
22940 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
22950 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66   : -1;.}..#ifdef
22960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
22970 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62  NAPSHOT./*.** Ob
22980 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20  tain a snapshot 
22990 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73  handle for the s
229a0 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62  napshot of datab
229b0 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c  ase zDb currentl
229c0 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  y .** being read
229d0 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a   by handle db..*
229e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
229f0 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71  apshot_get(.  sq
22a00 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
22a10 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
22a20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
22a30 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29  t **ppSnapshot.)
22a40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22a50 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
22a60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22a70 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
22a80 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
22a90 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
22aa0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
22ab0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
22ac0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
22ad0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
22ae0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22af0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
22b00 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  ;..  if( db->aut
22b10 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
22b20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
22b30 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
22b40 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
22b50 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
22b60 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
22b70 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  pBt = db->aDb[iD
22b80 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  b].pBt;.      if
22b90 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
22ba0 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
22bb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22bc0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
22bd0 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30  nTrans(pBt, 0, 0
22be0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22c00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22c10 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
22c20 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74  hotGet(sqlite3Bt
22c30 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70  reePager(pBt), p
22c40 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
22c50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22c60 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
22c70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
22c80 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  b->mutex);.#endi
22c90 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  f   /* SQLITE_OM
22ca0 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75  IT_WAL */.  retu
22cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22cc0 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  Open a read-tran
22cd0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
22ce0 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69  napshot idendifi
22cf0 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e  ed by pSnapshot.
22d00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
22d10 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
22d20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
22d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22d40 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  , .  sqlite3_sna
22d50 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
22d60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
22d70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
22d80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22d90 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
22da0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
22db0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
22dc0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
22dd0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
22de0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
22df0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
22e00 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
22e10 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
22e20 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  x);.  if( db->au
22e30 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
22e40 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
22e50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
22e60 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
22e70 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
22e80 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
22e90 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
22ea0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
22eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
22ec0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
22ed0 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  s(pBt)==0 ){.   
22ee0 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
22ef0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
22f00 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
22f10 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 63 6b       int bUnlock
22f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
22f30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
22f40 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29  InReadTrans(pBt)
22f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
22f60 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
22f70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
22f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22f90 50 61 67 65 72 53 6e 61 70 73 68 6f 74 43 68 65  PagerSnapshotChe
22fa0 63 6b 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70  ck(pPager, pSnap
22fb0 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20  shot);.         
22fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22fe0 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b 20 3d 20        bUnlock = 
22ff0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
23000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23010 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
23020 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
230a0 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
230b0 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73 68  (pPager, pSnapsh
230c0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ot);.        }. 
230d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
230e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
230f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23100 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
23110 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
23120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23130 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
23140 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
23150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23160 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20  f( bUnlock ){.  
23170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23180 61 67 65 72 53 6e 61 70 73 68 6f 74 55 6e 6c 6f  agerSnapshotUnlo
23190 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
231a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
231b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
231c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
231d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  b->mutex);.#endi
231e0 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  f   /* SQLITE_OM
231f0 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75  IT_WAL */.  retu
23200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23210 52 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20  Recover as many 
23220 73 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73  snapshots as pos
23230 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77  sible from the w
23240 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
23250 65 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d  ed with.** schem
23260 61 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73  a zDb of databas
23270 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
23280 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65  ite3_snapshot_re
23290 63 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64  cover(sqlite3 *d
232a0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
232b0 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Db){.  int rc = 
232c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
232d0 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66  int iDb;.#ifndef
232e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
232f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23300 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
23310 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
23320 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
23330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
23340 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
23350 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
23360 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23370 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
23380 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
23390 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
233a0 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d  Db);.  if( iDb==
233b0 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
233c0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
233d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
233e0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
233f0 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
23400 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
23410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23420 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
23430 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
23440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
23460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
23470 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72 28  SnapshotRecover(
23480 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
23490 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20  r(pBt));.       
234a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
234b0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
234c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
234d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
234e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
234f0 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
23500 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
23510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23520 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73 68  ** Free a snapsh
23530 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e  ot handle obtain
23540 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
23550 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a  snapshot_get()..
23560 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
23570 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71  snapshot_free(sq
23580 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
23590 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71  pSnapshot){.  sq
235a0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70  lite3_free(pSnap
235b0 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  shot);.}.#endif 
235c0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
235d0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
235e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
235f0 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
23600 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65  DIAGS./*.** Give
23610 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
23620 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
23630 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72 75 65  ion, return true
23640 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a   if that option.
23650 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e 64 20  ** was used and 
23660 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
23670 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e  .** The name can
23680 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69   optionally begi
23690 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22  n with "SQLITE_"
236a0 20 62 75 74 20 74 68 65 20 22 53 51 4c 49 54 45   but the "SQLITE
236b0 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69 73 20  _" prefix.** is 
236c0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f 72  not required for
236d0 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74   a match..*/.int
236e0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
236f0 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73  option_used(cons
23700 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65  t char *zOptName
23710 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
23720 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e   int nOpt;.  con
23730 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70  st char **azComp
23740 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51  ileOpt;. .#if SQ
23750 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
23760 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74  ARMOR.  if( zOpt
23770 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28  Name==0 ){.    (
23780 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
23790 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
237a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
237b0 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  f..  azCompileOp
237c0 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69  t = sqlite3Compi
237d0 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29  leOptions(&nOpt)
237e0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
237f0 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d  StrNICmp(zOptNam
23800 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20 37 29  e, "SQLITE_", 7)
23810 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b  ==0 ) zOptName +
23820 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  = 7;.  n = sqlit
23830 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e  e3Strlen30(zOptN
23840 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63  ame);..  /* Sinc
23850 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c  e nOpt is normal
23860 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64 69 67  ly in single dig
23870 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20 73 65  its, a linear se
23880 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20 61 64  arch is .  ** ad
23890 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20  equate. No need 
238a0 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73 65 61  for a binary sea
238b0 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  rch. */.  for(i=
238c0 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b  0; i<nOpt; i++){
238d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
238e0 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d  StrNICmp(zOptNam
238f0 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b  e, azCompileOpt[
23900 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26  i], n)==0.     &
23910 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68 61  & sqlite3IsIdCha
23920 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r((unsigned char
23930 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d  )azCompileOpt[i]
23940 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  [n])==0.    ){. 
23950 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
23960 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23970 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
23980 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f  turn the N-th co
23990 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
239a0 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20  n string.  If N 
239b0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c  is out of range,
239c0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 4c  .** return a NUL
239d0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
239e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
239f0 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
23a00 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  get(int N){.  in
23a10 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20  t nOpt;.  const 
23a20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65  char **azCompile
23a30 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65  Opt;.  azCompile
23a40 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  Opt = sqlite3Com
23a50 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70  pileOptions(&nOp
23a60 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26  t);.  if( N>=0 &
23a70 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20  & N<nOpt ){.    
23a80 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65  return azCompile
23a90 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65  Opt[N];.  }.  re
23aa0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
23ab0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23ac0 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
23ad0 41 47 53 20 2a 2f 0a                             AGS */.