/ Hex Artifact Content
Login

Artifact 1648fc7a9bcfdbfd9a9a04af96ff2796c3164b3f3c7e56ed63a3c51cd11d198d:


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 20 20 20 20 64 65 66 61 75      }..    defau
5cb0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5cc0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5cd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ce0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5cf0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5d10: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5d20: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5d30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5d40: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5d50: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5d60: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5d70: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5d80: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5d90: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5da0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5db0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5dc0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5dd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5de0: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5df0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5e00: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5e10: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5e20: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5e30: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5e40: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5e50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5e60: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5e70: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5e80: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5e90: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5ea0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5eb0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ec0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
5ed0: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
5ee0: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
5ef0: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
5f00: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
5f10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5f20: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
5f30: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
5f40: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
5f50: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
5f60: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
5f70: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5f80: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
5f90: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
5fa0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
5fb0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
5fc0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
5fd0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
5fe0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
5ff0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6000: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6010: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6020: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6030: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6050: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6060: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
6070: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
6080: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
6090: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
60a0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
60b0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
60c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
60d0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
60e0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
60f0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6100: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6110: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6120: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6130: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6140: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6150: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6160: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
6170: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
6180: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
6190: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
61a0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
61b0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
61c0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
61d0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
61e0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
61f0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6200: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6210: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6220: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6230: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6240: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6250: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6260: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
6270: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
6280: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
6290: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
62a0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
62b0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
62c0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
62d0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
62e0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
62f0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6300: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6310: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6320: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6330: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6340: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6350: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6360: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
6370: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6380: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
6390: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
63a0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
63b0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
63c0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
63d0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63e0: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
63f0: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6400: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6410: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6420: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6430: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6440: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6450: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6460: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
6470: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
6480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
6490: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
64a0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
64b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
64c0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
64d0: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
64e0: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
64f0: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6500: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6510: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6520: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6530: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6540: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6560: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6570: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
6580: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6590: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
65a0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
65b0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
65c0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
65d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
65e0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
65f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6600: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6610: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6620: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6630: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6640: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6650: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6660: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
6670: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
6680: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6690: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
66a0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
66b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
66c0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
66d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
66e0: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
66f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6700: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6710: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6720: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6730: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6740: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6750: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6760: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6770: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6780: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6790: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
67a0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
67b0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
67c0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
67e0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
67f0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6810: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6820: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6840: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6850: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6860: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6890: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
68a0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
68b0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
68c0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
68d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
68e0: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
68f0: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6900: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6910: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6920: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6930: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6940: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6950: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6960: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6970: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6980: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6990: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
69a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
69b0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
69c0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
69d0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
69e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
69f0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6a10: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6a20: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6a30: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6a40: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6a50: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6a60: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6a70: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6a80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6aa0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6ab0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6ac0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6ad0: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6ae0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6af0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6b00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6b10: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6b30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6b40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6b50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6b60: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6b70: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b90: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6ba0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6bb0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6bc0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6bd0: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6be0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6bf0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6c00: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6c10: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6c20: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6c30: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6c40: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6c50: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6c60: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6c70: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6c80: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6c90: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6ca0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6cb0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6cc0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6cd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6cf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6d00: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6d10: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6d20: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6d30: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6d40: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6d50: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6d60: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6d70: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6d80: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6d90: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6da0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6db0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6dc0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6dd0: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6de0: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6df0: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6e00: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6e10: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6e20: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6e30: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6e40: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6e50: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6e60: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6e70: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6e80: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6e90: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6ea0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6eb0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ec0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
6ed0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6ee0: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
6ef0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
6f00: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
6f10: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6f20: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6f30: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
6f40: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
6f50: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
6f60: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6f70: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
6f80: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
6f90: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
6fa0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6fb0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6fc0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
6fd0: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
6fe0: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
6ff0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7000: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7010: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7020: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7030: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7040: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7050: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7060: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7070: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
7080: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
7090: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
70a0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
70b0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
70c0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
70d0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69     };.      unsi
70e0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
70f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7100: 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34  ROR; /* IMP: R-4
7110: 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20  2790-23372 */.  
7120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
7130: 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70  rraySize(aFlagOp
7140: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
7150: 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e   if( aFlagOp[i].
7160: 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20  op==op ){.      
7170: 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20      int onoff = 
7180: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
7190: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a  .          int *
71a0: 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70  pRes = va_arg(ap
71b0: 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20  , int*);.       
71c0: 20 20 20 75 33 32 20 6f 6c 64 46 6c 61 67 73 20     u32 oldFlags 
71d0: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  = db->flags;.   
71e0: 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66         if( onoff
71f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
7200: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61    db->flags |= a
7210: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
7220: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
7230: 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a  if( onoff==0 ){.
7240: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7250: 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f  flags &= ~aFlagO
7260: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7280: 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64   if( oldFlags!=d
7290: 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  b->flags ){.    
72a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
72b0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
72c0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
72d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
72e0: 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20     if( pRes ){. 
72f0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
7300: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7310: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29  aFlagOp[i].mask)
7320: 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  !=0;.          }
7330: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
7350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7360: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7380: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
7390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
73a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
73b0: 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75 66   true if the buf
73c0: 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f  fer z[0..n-1] co
73d0: 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65  ntains all space
73e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
73f0: 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74   allSpaces(const
7400: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
7410: 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  {.  while( n>0 &
7420: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b  & z[n-1]==' ' ){
7430: 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e   n--; }.  return
7440: 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   n==0;.}../*.** 
7450: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
7460: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
7470: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49  nction named "BI
7480: 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61  NARY" which is a
7490: 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62  lways.** availab
74a0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
74b0: 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e   padFlag argumen
74c0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
74d0: 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e 67  en space padding
74e0: 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f   at the end.** o
74f0: 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e  f strings is ign
7500: 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c  ored.  This impl
7510: 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d  ements the RTRIM
7520: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   collation..*/.s
7530: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c  tatic int binCol
7540: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  lFunc(.  void *p
7550: 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b  adFlag,.  int nK
7560: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7570: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7580: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7590: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
75a0: 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
75b0: 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
75c0: 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45   : nKey2;.  /* E
75d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
75e0: 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62 75  033-28449 The bu
75f0: 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f  ilt-in BINARY co
7600: 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  llation compares
7610: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62 79  .  ** strings by
7620: 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e 67  te by byte using
7630: 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66 75   the memcmp() fu
7640: 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  nction from the 
7650: 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20  standard C.  ** 
7660: 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73  library. */.  as
7670: 73 65 72 74 28 20 70 4b 65 79 31 20 26 26 20 70  sert( pKey1 && p
7680: 4b 65 79 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d  Key2 );.  rc = m
7690: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
76a0: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
76b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
76c0: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
76d0: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
76e0: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
76f0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
7700: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
7710: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
7720: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
7730: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7740: 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52 49  31624-24737 RTRI
7750: 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59  M is like BINARY
7760: 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78 74   except that ext
7770: 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63  ra.      ** spac
7780: 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
7790: 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 64   either string d
77a0: 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
77b0: 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65   result. In othe
77c0: 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73  r.      ** words
77d0: 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63  , strings will c
77e0: 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
77f0: 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c  one another as l
7800: 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20 20  ong as they.    
7810: 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79    ** differ only
7820: 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   in the number o
7830: 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  f spaces at the 
7840: 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  end..      */.  
7850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7860: 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
7870: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
7880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7890: 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74  ** Another built
78a0: 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  -in collating se
78b0: 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20  quence: NOCASE. 
78c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c  .**.** This coll
78d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
78e0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
78f0: 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20   used for "case 
7900: 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63  independent.** c
7910: 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69  omparison". SQLi
7920: 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  te's knowledge o
7930: 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  f upper and lowe
7940: 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  r case equivalen
7950: 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e  ts.** extends on
7960: 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61  ly to the 26 cha
7970: 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20  racters used in 
7980: 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  the English lang
7990: 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  uage..**.** At t
79a0: 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20  he moment there 
79b0: 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20  is only a UTF-8 
79c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
79d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
79e0: 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
79f0: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
7a00: 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ed,.  int nKey1,
7a10: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7a20: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
7a30: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
7a40: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20  y2.){.  int r = 
7a50: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
7a60: 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68  .      (const ch
7a70: 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e  ar *)pKey1, (con
7a80: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c  st char *)pKey2,
7a90: 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e   (nKey1<nKey2)?n
7aa0: 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55  Key1:nKey2);.  U
7ab0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7ac0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7ad0: 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20  0==r ){.    r = 
7ae0: 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d  nKey1-nKey2;.  }
7af0: 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a  .  return r;.}..
7b00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7b10: 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f   ROWID of the mo
7b20: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
7b30: 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34  .*/.sqlite_int64
7b40: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
7b50: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
7b60: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
7b70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
7b80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
7b90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7ba0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
7bb0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
7bc0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
7bd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
7be0: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c  f.  return db->l
7bf0: 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  astRowid;.}../*.
7c00: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
7c10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
7c20: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
7c30: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49  sert_rowid() API
7c40: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
7c50: 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c  id sqlite3_set_l
7c60: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7c70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71  (sqlite3 *db, sq
7c80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
7c90: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
7ca0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7cb0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7cc0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7cd0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7ce0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7cf0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7d00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
7d10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
7d20: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
7d30: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
7d40: 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65  iRowid;.  sqlite
7d50: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7d60: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  ->mutex);.}../*.
7d70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7d80: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
7d90: 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  in the most rece
7da0: 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
7db0: 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e  e3_exec()..*/.in
7dc0: 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t sqlite3_change
7dd0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7de0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7df0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
7e00: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
7e10: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
7e20: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
7e30: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7e40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7e50: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7e60: 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d  n db->nChange;.}
7e70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7e80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7e90: 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64  nges since the d
7ea0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
7eb0: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e  as opened..*/.in
7ec0: 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  t sqlite3_total_
7ed0: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
7ee0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
7ef0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
7f00: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
7f10: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
7f20: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
7f30: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
7f40: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7f50: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
7f60: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74   return db->nTot
7f70: 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  alChange;.}../*.
7f80: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65  ** Close all ope
7f90: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68  n savepoints. Th
7fa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
7fb0: 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65   manipulates fie
7fc0: 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  lds of the.** da
7fd0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62  tabase handle ob
7fe0: 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f  ject, it does no
7ff0: 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65  t close any save
8000: 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20  points that may 
8010: 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68  be open.** at th
8020: 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c  e b-tree/pager l
8030: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
8040: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
8050: 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ints(sqlite3 *db
8060: 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e  ){.  while( db->
8070: 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
8080: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d    Savepoint *pTm
8090: 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  p = db->pSavepoi
80a0: 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76  nt;.    db->pSav
80b0: 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
80c0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
80d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70  3DbFree(db, pTmp
80e0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61  );.  }.  db->nSa
80f0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64  vepoint = 0;.  d
8100: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
8110: 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73  0;.  db->isTrans
8120: 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20  actionSavepoint 
8130: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
8140: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
8150: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  tor function ass
8160: 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e  ociated with Fun
8170: 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20  cDef p, if any. 
8180: 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68  Except,.** if th
8190: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  is is not the la
81a0: 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  st copy of the f
81b0: 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  unction, do not 
81c0: 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69  invoke it. Multi
81d0: 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66  ple.** copies of
81e0: 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69   a single functi
81f0: 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77  on are created w
8200: 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74  hen create_funct
8210: 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a  ion() is called.
8220: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41  ** with SQLITE_A
8230: 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  NY as the encodi
8240: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
8250: 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  id functionDestr
8260: 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oy(sqlite3 *db, 
8270: 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46  FuncDef *p){.  F
8280: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
8290: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e  Destructor = p->
82a0: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  u.pDestructor;. 
82b0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
82c0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
82d0: 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tor->nRef--;.   
82e0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
82f0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
8300: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
8310: 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75  xDestroy(pDestru
8320: 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29  ctor->pUserData)
8330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8340: 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72  bFree(db, pDestr
8350: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
8360: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f  }.}../*.** Disco
8370: 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65  nnect all sqlite
8380: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74  3_vtab objects t
8390: 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61  hat belong to da
83a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
83b0: 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73  n.** db. This is
83c0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20   called when db 
83d0: 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e  is being closed.
83e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
83f0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
8400: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  b(sqlite3 *db){.
8410: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8420: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8430: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68  .  int i;.  Hash
8440: 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74  Elem *p;.  sqlit
8450: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
8460: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
8470: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8480: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
8490: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
84a0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69  ].pSchema;.    i
84b0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53  f( db->aDb[i].pS
84c0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66  chema ){.      f
84d0: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
84e0: 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
84f0: 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71  blHash); p; p=sq
8500: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
8510: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
8520: 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a  *pTab = (Table *
8530: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8540: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
8550: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
8560: 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73  ) sqlite3VtabDis
8570: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62  connect(db, pTab
8580: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8590: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c  .  }.  for(p=sql
85a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
85b0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70  ->aModule); p; p
85c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
85d0: 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  p)){.    Module 
85e0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
85f0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
8600: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (p);.    if( pMo
8610: 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20  d->pEpoTab ){.  
8620: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 44      sqlite3VtabD
8630: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d  isconnect(db, pM
8640: 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20  od->pEpoTab);.  
8650: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8660: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
8670: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
8680: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
8690: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
86a0: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23  PARAMETER(db);.#
86b0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
86c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61  eturn TRUE if da
86d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
86e0: 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c  n db has unfinal
86f0: 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a  ized prepared.**
8700: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75   statements or u
8710: 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65  nfinished sqlite
8720: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
8730: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
8740: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  t connectionIsBu
8750: 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sy(sqlite3 *db){
8760: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
8770: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8780: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
8790: 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70  ) );.  if( db->p
87a0: 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Vdbe ) return 1;
87b0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
87c0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
87d0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
87e0: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
87f0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
8800: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
8810: 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72  kup(pBt) ) retur
8820: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
8830: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n 0;.}../*.** Cl
8840: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
8850: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
8860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
8870: 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74  lite3Close(sqlit
8880: 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63  e3 *db, int forc
8890: 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20  eZombie){.  if( 
88a0: 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  !db ){.    /* EV
88b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32  IDENCE-OF: R-632
88c0: 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67  57-11740 Calling
88d0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
88e0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
88f0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69  e3_close_v2() wi
8900: 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  th a NULL pointe
8910: 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  r argument is a 
8920: 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
8930: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
8940: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
8950: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
8960: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
8970: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
8980: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
8990: 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
89a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
89b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
89c0: 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51   db->mTrace & SQ
89d0: 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
89e0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61   ){.    db->xTra
89f0: 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  ce(SQLITE_TRACE_
8a00: 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63  CLOSE, db->pTrac
8a10: 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20  eArg, db, 0);.  
8a20: 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44  }..  /* Force xD
8a30: 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20  isconnect calls 
8a40: 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74  on all virtual t
8a50: 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f  ables */.  disco
8a60: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29  nnectAllVtab(db)
8a70: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
8a80: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
8a90: 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74  , the disconnect
8aa0: 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61  AllVtab() call a
8ab0: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
8ac0: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
8ad0: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
8ae0: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
8af0: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
8b00: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
8b10: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
8b20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
8b30: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
8b40: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
8b50: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
8b60: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
8b70: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
8b80: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
8b90: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
8ba0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
8bb0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8bc0: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
8bd0: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
8be0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
8bf0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
8c00: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8c10: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
8c20: 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20  Legacy behavior 
8c30: 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29  (sqlite3_close()
8c40: 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f   behavior) is to
8c50: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
8c60: 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20  ITE_BUSY if the 
8c70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e  connection can n
8c80: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
8c90: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
8ca0: 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69   if( !forceZombi
8cb0: 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  e && connectionI
8cc0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
8cd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
8ce0: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
8cf0: 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f  BUSY, "unable to
8d00: 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e   close due to un
8d10: 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20  finalized ".    
8d20: 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f     "statements o
8d30: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63  r unfinished bac
8d40: 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  kups");.    sqli
8d50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8d60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
8d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8d80: 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  SY;.  }..#ifdef 
8d90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
8da0: 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
8db0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
8dc0: 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
8dd0: 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e   Closing the han
8de0: 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61  dle. Fourth para
8df0: 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
8e00: 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a  the value 2. */.
8e10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
8e20: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
8e30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8e40: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
8e50: 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23  db, 0, 2);.  }.#
8e60: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76  endif..  /* Conv
8e70: 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ert the connecti
8e80: 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65  on into a zombie
8e90: 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20   and then close 
8ea0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d  it..  */.  db->m
8eb0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
8ec0: 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71  GIC_ZOMBIE;.  sq
8ed0: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
8ee0: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62  ndCloseZombie(db
8ef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8f00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8f10: 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f  Two variations o
8f20: 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74  n the public int
8f30: 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69  erface for closi
8f40: 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
8f50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
8f60: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
8f70: 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73   version returns
8f80: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
8f90: 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63  .** leaves the c
8fa0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e  onnection option
8fb0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e   if there are un
8fc0: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
8fd0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
8fe0: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
8ff0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20  qlite3_backups. 
9000: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
9010: 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69  se_v2().** versi
9020: 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f  on forces the co
9030: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f  nnection to beco
9040: 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74  me a zombie if t
9050: 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c  here are.** uncl
9060: 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20  osed resources, 
9070: 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72  and arranges for
9080: 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68   deallocation wh
9090: 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70  en the last.** p
90a0: 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
90b0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
90c0: 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e  up closes..*/.in
90d0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
90e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
90f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
9100: 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73  e(db,0); }.int s
9110: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
9120: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
9130: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
9140: 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a  e(db,1); }.../*.
9150: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74  ** Close the mut
9160: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63  ex on database c
9170: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a  onnection db..**
9180: 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  .** Furthermore,
9190: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
91a0: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20  nection db is a 
91b0: 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20  zombie (meaning 
91c0: 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61  that there.** ha
91d0: 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63  s been a prior c
91e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
91f0: 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69  lose(db) or sqli
9200: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
9210: 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73  ) and.** every s
9220: 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20  qlite3_stmt has 
9230: 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  now been finaliz
9240: 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c  ed and every sql
9250: 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a  ite3_backup has.
9260: 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65  ** finished, the
9270: 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  n free all resou
9280: 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rces..*/.void sq
9290: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
92a0: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71  ndCloseZombie(sq
92b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61  lite3 *db){.  Ha
92c0: 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20  shElem *i;      
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92e0: 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72   Hash table iter
92f0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ator */.  int j;
9300: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
9310: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
9320: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20  sqlite3_stmt or 
9330: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
9340: 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69  bjects.  ** or i
9350: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9360: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
9370: 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69  n closed by sqli
9380: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a  te3_close_v2(),.
9390: 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c    ** then just l
93a0: 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61  eave the mutex a
93b0: 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
93c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21    if( db->magic!
93d0: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f  =SQLITE_MAGIC_ZO
93e0: 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69  MBIE || connecti
93f0: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
9400: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
9410: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9420: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  x);.    return;.
9430: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
9440: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
9450: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
9460: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
9470: 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a  nection has.  **
9480: 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69   closed all sqli
9490: 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c  te3_stmt and sql
94a0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
94b0: 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e  cts and has been
94c0: 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  .  ** passed to 
94d0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d  sqlite3_close (m
94e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69  eaning that it i
94f0: 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68  s a zombie).  Th
9500: 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f  erefore,.  ** go
9510: 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20   ahead and free 
9520: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  all resources.. 
9530: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74   */..  /* If a t
9540: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
9550: 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  en, roll it back
9560: 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75  . This also ensu
9570: 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a  res that if.  **
9580: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63   any database sc
9590: 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20  hemas have been 
95a0: 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75  modified by an u
95b0: 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73  ncommitted trans
95c0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79  action.  ** they
95d0: 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20   are reset. And 
95e0: 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65  that the require
95f0: 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
9600: 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20  s held to make. 
9610: 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f   ** the pager ro
9620: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
9630: 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69  a reset an atomi
9640: 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  c operation. */.
9650: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
9660: 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
9670: 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  OK);..  /* Free 
9680: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
9690: 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
96a0: 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ures. */.  sqlit
96b0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
96c0: 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  s(db);..  /* Clo
96d0: 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  se all database 
96e0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
96f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
9700: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
9710: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
9720: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
9730: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
9740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9750: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
9760: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
9770: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
9780: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
9790: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
97a0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
97b0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72  }.  }.  /* Clear
97c0: 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61   the TEMP schema
97d0: 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20   separately and 
97e0: 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62  last */.  if( db
97f0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9800: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
9810: 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61  chemaClear(db->a
9820: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
9830: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
9840: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
9850: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74  ..  /* Free up t
9860: 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69  he array of auxi
9870: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
9880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c  */.  sqlite3Coll
9890: 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61  apseDatabaseArra
98a0: 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28  y(db);.  assert(
98b0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20   db->nDb<=2 );. 
98c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
98d0: 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  ==db->aDbStatic 
98e0: 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68  );..  /* Tell th
98f0: 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79  e code in notify
9900: 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  .c that the conn
9910: 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ection no longer
9920: 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20   holds any.  ** 
9930: 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e  locks and does n
9940: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66  ot require any f
9950: 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f  urther unlock-no
9960: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
9970: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
9980: 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64  nnectionClosed(d
9990: 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c  b);..  for(i=sql
99a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
99b0: 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73  ->aFunc); i; i=s
99c0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
99d0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
99e0: 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70  pNext, *p;.    p
99f0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
9a00: 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  a(i);.    do{.  
9a10: 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74      functionDest
9a20: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  roy(db, p);.    
9a30: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
9a40: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
9a50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
9a60: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
9a70: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29  .    }while( p )
9a80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
9a90: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46  ashClear(&db->aF
9aa0: 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71  unc);.  for(i=sq
9ab0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9ac0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b  b->aCollSeq); i;
9ad0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9ae0: 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53  t(i)){.    CollS
9af0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9b00: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9b10: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a  hData(i);.    /*
9b20: 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74   Invoke any dest
9b30: 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72  ructors register
9b40: 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  ed for collation
9b50: 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64   sequence user d
9b60: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ata. */.    for(
9b70: 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
9b80: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b        if( pColl[
9b90: 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  j].xDel ){.     
9ba0: 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c     pColl[j].xDel
9bb0: 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29  (pColl[j].pUser)
9bc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9bd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9be0: 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  e(db, pColl);.  
9bf0: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
9c00: 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  lear(&db->aCollS
9c10: 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eq);.#ifndef SQL
9c20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9c30: 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71  TABLE.  for(i=sq
9c40: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9c50: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20  b->aModule); i; 
9c60: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9c70: 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (i)){.    Module
9c80: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
9c90: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
9ca0: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(i);.    if( pM
9cb0: 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a  od->xDestroy ){.
9cc0: 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73        pMod->xDes
9cd0: 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29  troy(pMod->pAux)
9ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9cf0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
9d00: 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70  TableClear(db, p
9d10: 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mod);.    sqlite
9d20: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
9d30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9d40: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
9d50: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
9d60: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
9d70: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20  db, SQLITE_OK); 
9d80: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61  /* Deallocates a
9d90: 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20  ny cached error 
9da0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71  strings. */.  sq
9db0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64  lite3ValueFree(d
9dc0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69  b->pErr);.  sqli
9dd0: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
9de0: 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49  ns(db);.#if SQLI
9df0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
9e00: 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  CATION.  sqlite3
9e10: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9e20: 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c  AuthUser);.  sql
9e30: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
9e40: 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e  th.zAuthPW);.#en
9e50: 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  dif..  db->magic
9e60: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
9e70: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
9e80: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
9e90: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
9ea0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
9eb0: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
9ec0: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
9ed0: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
9ee0: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
9ef0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
9f00: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
9f10: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
9f20: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
9f30: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
9f40: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
9f50: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
9f60: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
9f70: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
9f80: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
9f90: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
9fa0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
9fb0: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
9fc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
9fd0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9ff0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
a000: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
a010: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
a020: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
a030: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
a040: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
a050: 28 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69  ( sqlite3Lookasi
a060: 64 65 55 73 65 64 28 64 62 2c 30 29 3d 3d 30 20  deUsed(db,0)==0 
a070: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  );.  if( db->loo
a080: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
a090: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a0a0: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
a0b0: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
a0c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a0d0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
a0e0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
a0f0: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
a100: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
a110: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
a120: 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f   any write curso
a130: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
a140: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
a150: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
a160: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
a170: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
a180: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
a190: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
a1a0: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
a1b0: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
a1c0: 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61  hat cursor.  Rea
a1d0: 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e  d cursors remain
a1e0: 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a   open and valid.
a1f0: 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65  ** but are "save
a200: 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  d" in case the t
a210: 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d  able pages are m
a220: 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a  oved around..*/.
a230: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
a240: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
a250: 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64  *db, int tripCod
a260: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
a270: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
a280: 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e    int schemaChan
a290: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
a2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a2b0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
a2c0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
a2d0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
a2e0: 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d  /* Obtain all b-
a2f0: 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66  tree mutexes bef
a300: 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63  ore making any c
a310: 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c  alls to BtreeRol
a320: 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54  lback(). .  ** T
a330: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
a340: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
a350: 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72  nsaction being r
a360: 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20  olled back has. 
a370: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65   ** modified the
a380: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
a390: 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  . If the b-tree 
a3a0: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
a3b0: 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c  taken.  ** here,
a3c0: 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68   then another sh
a3d0: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
a3e0: 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61  ction might snea
a3f0: 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a  k in between.  *
a400: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  * the database r
a410: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
a420: 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20  ma reset, which 
a430: 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a  can cause false.
a440: 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
a450: 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20  reports in some 
a460: 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c  cases.  */.  sql
a470: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
a480: 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43  l(db);.  schemaC
a490: 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62  hange = (db->mDb
a4a0: 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
a4b0: 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 20  chemaChange)!=0 
a4c0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
a4d0: 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ==0;..  for(i=0;
a4e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a4f0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a500: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a510: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a520: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
a530: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
a540: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
a550: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
a560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a570: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
a580: 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61  ripCode, !schema
a590: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20  Change);.    }. 
a5a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
a5b0: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
a5c0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
a5d0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
a5e0: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 26 44   (db->mDbFlags&D
a5f0: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
a600: 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  ge)!=0 && db->in
a610: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
a620: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
a630: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
a640: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
a650: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
a660: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
a670: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a680: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
a690: 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66  );..  /* Any def
a6a0: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
a6b0: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
a6c0: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
a6d0: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
a6e0: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
a6f0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
a700: 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  mmCons = 0;.  db
a710: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
a720: 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20  TE_DeferFKs;..  
a730: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
a740: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
a750: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
a760: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
a770: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
a780: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
a790: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
a7a0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
a7b0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
a7c0: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
a7d0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
a7e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
a7f0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
a800: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
a810: 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  he name correspo
a820: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72  nding to the err
a830: 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69  or code.** speci
a840: 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  fied in the argu
a850: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ment..*/.#if def
a860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44  ined(SQLITE_NEED
a870: 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74  _ERR_NAME).const
a880: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
a890: 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20  rName(int rc){. 
a8a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a8b0: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
a8c0: 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20   origRc = rc;.  
a8d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20  for(i=0; i<2 && 
a8e0: 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72  zName==0; i++, r
a8f0: 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20  c &= 0xff){.    
a900: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
a910: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a920: 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK:             
a930: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a940: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
a950: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a960: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a970: 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20  _ERROR:         
a980: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a990: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
a9a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a9b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a9c0: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
a9d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a9e0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
a9f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aa00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aa10: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
aa20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aa30: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
aa40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
aa50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aa60: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
aa70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa80: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aaa0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aab0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
aac0: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
aad0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
aae0: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
aaf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ab00: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
ab10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ab20: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
ab40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ab50: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
ab60: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
ab70: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
ab80: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
ab90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aba0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
abb0: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
abc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
abd0: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
abe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
abf0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ac10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
ac20: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
ac30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ac40: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
ac50: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
ac60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
ac70: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
ac80: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
ac90: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
aca0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
acb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
acc0: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
acd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ace0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
acf0: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
ad00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ad10: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
ad20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
ad40: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
ad50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ad60: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
ad70: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
ad80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
ad90: 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3a  ADONLY_CANTINIT:
ada0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
adb0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
adc0: 4e 49 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NIT"; break;.   
add0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
ade0: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
adf0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
ae00: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
ae10: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
ae20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ae30: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
ae40: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
ae50: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
ae60: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
ae70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae80: 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
ae90: 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ORY: zName = "SQ
aea0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49  LITE_READONLY_DI
aeb0: 52 45 43 54 4f 52 59 22 3b 62 72 65 61 6b 3b 0a  RECTORY";break;.
aec0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aed0: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
aee0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aef0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
af00: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
af10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
af20: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
af30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
af40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
af50: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
af60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af70: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
af80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
af90: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
afa0: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
afb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
afc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
afd0: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
afe0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
aff0: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
b000: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b010: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
b020: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b030: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b040: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
b050: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b060: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
b070: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
b080: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b090: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
b0a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b0b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b0c0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
b0d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b0e0: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
b0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b100: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
b110: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
b120: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b130: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
b140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b150: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b160: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
b170: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b180: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
b190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b1a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b1b0: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
b1c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b1d0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
b1e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b1f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b200: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
b210: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b220: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
b230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b250: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
b260: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b270: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
b280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b290: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b2a0: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
b2b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b2c0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
b2d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b2f0: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
b300: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b310: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
b320: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b330: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b340: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b350: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b380: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b390: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b3a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b3b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b3c0: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
b3d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b3e0: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
b3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b400: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b410: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
b420: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b430: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b460: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
b470: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b480: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b490: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b4a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b4b0: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b4c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b4d0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b4e0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b4f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b500: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b510: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b520: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b530: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b540: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b550: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
b560: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b570: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b580: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
b590: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b5a0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
b5b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b5c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b5d0: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
b5e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b5f0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
b600: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b610: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b620: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b630: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b640: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b650: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
b660: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b670: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
b680: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b690: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
b6a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b6b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
b6c0: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
b6d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b6e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
b6f0: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
b700: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b710: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
b720: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
b740: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
b750: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b760: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
b770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
b790: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b7a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
b7b0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
b7c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b7d0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
b7e0: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
b7f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
b800: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
b810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b820: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
b830: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
b840: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
b850: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
b860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b870: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b890: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
b8a0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
b8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b8c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b8d0: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
b8e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b8f0: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
b900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b920: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
b930: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b940: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b950: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
b960: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b970: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
b980: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b990: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b9a0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b9b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b9c0: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
b9d0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b9e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b9f0: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
ba00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba10: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
ba20: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
ba30: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
ba40: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
ba50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba60: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
ba70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba80: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
ba90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
baa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bab0: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
bac0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bad0: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
bae0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
baf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb00: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
bb10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bb20: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
bb30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bb40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bb50: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
bb60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bb70: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bb90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bba0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
bbb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bbc0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bbd0: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
bbe0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bbf0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bc00: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
bc10: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bc20: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
bc30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bc40: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bc50: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
bc60: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bc70: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
bc80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc90: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bca0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bcd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bce0: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
bcf0: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
bd00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd10: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
bd20: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
bd30: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bd40: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
bd50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd60: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
bd70: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bda0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bdb0: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
bdc0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
bdd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bde0: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
bdf0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
be00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
be10: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
be20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
be30: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
be40: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
be70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
be80: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
be90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bea0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
beb0: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
bec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bed0: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
bee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bef0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bf00: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bf30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bf40: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bf50: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
bf60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
bf80: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
bf90: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bfa0: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
bfb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bfc0: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
bfd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bfe0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
bff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c000: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c010: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
c020: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c030: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
c040: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c050: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c060: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
c070: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c080: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
c090: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c0a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c0b0: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
c0c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c0d0: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c0f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c100: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
c110: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c120: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
c130: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
c140: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c150: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
c160: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c170: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
c180: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
c190: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c1a0: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c1c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
c1d0: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
c1e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c1f0: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c210: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
c220: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c240: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
c250: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c260: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c270: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
c280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c290: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c2a0: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
c2b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c2c0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c2d0: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
c2e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c2f0: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
c300: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c330: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c340: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
c350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c360: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
c370: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c380: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
c390: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
c3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c3b0: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c3c0: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
c3d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c3e0: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
c3f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c400: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c420: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
c430: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
c440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c450: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
c460: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
c470: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
c480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c490: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
c4a0: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
c4b0: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
c4c0: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
c4d0: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
c4e0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
c4f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c500: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
c510: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
c520: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
c530: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
c540: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
c550: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
c560: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
c570: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
c580: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
c590: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
c5a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
c5b0: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
c5c0: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
c5d0: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
c5e0: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
c5f0: 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  gic error",.    
c600: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
c610: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
c620: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
c630: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
c640: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
c650: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c660: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
c670: 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65 64  / "query aborted
c680: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c690: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
c6a0: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
c6b0: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c6c0: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
c6d0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
c6e0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
c6f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
c700: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
c710: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
c720: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
c730: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
c740: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
c750: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
c760: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c770: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
c780: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
c790: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
c7a0: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
c7b0: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
c7c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
c7d0: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
c7e0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
c7f0: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
c800: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
c810: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
c820: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
c830: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
c840: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
c850: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
c860: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
c870: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
c880: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
c890: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
c8a0: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
c8b0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
c8c0: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
c8d0: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
c8e0: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
c8f0: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
c900: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
c910: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
c920: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
c930: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c940: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
c950: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
c960: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
c970: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c980: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
c990: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
c9a0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
c9b0: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
c9c0: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
c9d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
c9e0: 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64 20  SE      */ "bad 
c9f0: 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74 68  parameter or oth
ca00: 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c 0a  er API misuse",.
ca10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
ca20: 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f 2a  SABLE_LFS.    /*
ca30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
ca40: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
ca50: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
ca60: 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a 20  sabled",.#else. 
ca70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
ca80: 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 23  FS       */ 0,.#
ca90: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51 4c  endif.    /* SQL
caa0: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
cab0: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
cac0: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
cad0: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
cae0: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
caf0: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
cb00: 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e 20       */ "column 
cb10: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
cb20: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
cb30: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
cb40: 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  / "file is not a
cb50: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
cb60: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  /* SQLITE_NOTICE
cb70: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 69 66 69        */ "notifi
cb80: 63 61 74 69 6f 6e 20 6d 65 73 73 61 67 65 22 2c  cation message",
cb90: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 57  .    /* SQLITE_W
cba0: 41 52 4e 49 4e 47 20 20 20 20 20 2a 2f 20 22 77  ARNING     */ "w
cbb0: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 22 2c  arning message",
cbc0: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
cbd0: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
cbe0: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
cbf0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
cc00: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
cc10: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
cc20: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
cc30: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
cc40: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
cc50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cc60: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 7b 0a 20 20  SQLITE_ROW: {.  
cc70: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 6e 6f 74      zErr = "anot
cc80: 68 65 72 20 72 6f 77 20 61 76 61 69 6c 61 62 6c  her row availabl
cc90: 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e";.      break;
cca0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ccb0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 7b 0a 20  SQLITE_DONE: {. 
ccc0: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6e 6f 20       zErr = "no 
ccd0: 6d 6f 72 65 20 72 6f 77 73 20 61 76 61 69 6c 61  more rows availa
cce0: 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ble";.      brea
ccf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
cd00: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
cd10: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
cd20: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
cd30: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
cd40: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
cd50: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
cd60: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
cd70: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
cd80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cd90: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
cda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
cdb0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
cdc0: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
cdd0: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
cde0: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
cdf0: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
ce00: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
ce10: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
ce20: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
ce30: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
ce40: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
ce50: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
ce60: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
ce70: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
ce80: 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72 65 74 72 79  on-zero to retry
ce90: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 52 65 74 75   the lock.  Retu
cea0: 72 6e 20 7a 65 72 6f 20 74 6f 20 73 74 6f 70 20  rn zero to stop 
ceb0: 74 72 79 69 6e 67 0a 2a 2a 20 61 6e 64 20 63 61  trying.** and ca
cec0: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 72 65  use SQLite to re
ced0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
cee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cef0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
cf00: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  yCallback(.  voi
cf10: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
cf20: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
cf30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
cf40: 20 20 69 6e 74 20 63 6f 75 6e 74 2c 20 20 20 20    int count,    
cf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cf60: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61  mber of times ta
cf70: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73  ble has been bus
cf80: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  y */.  sqlite3_f
cf90: 69 6c 65 20 2a 70 46 69 6c 65 20 20 20 20 20 20  ile *pFile      
cfa0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 6f 6e 20 77  /* The file on w
cfb0: 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 6f 63  hich the lock oc
cfc0: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  curred */.){.#if
cfd0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
cfe0: 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  | HAVE_USLEEP.  
cff0: 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
d000: 66 6f 72 20 73 79 73 74 65 6d 73 20 74 68 61 74  for systems that
d010: 20 68 61 76 65 20 73 75 70 70 6f 72 74 20 66 6f   have support fo
d020: 72 20 73 6c 65 65 70 69 6e 67 20 66 6f 72 20 66  r sleeping for f
d030: 72 61 63 74 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a  ractions of.  **
d040: 20 61 20 73 65 63 6f 6e 64 2e 20 20 45 78 61 6d   a second.  Exam
d050: 70 6c 65 73 3a 20 20 41 6c 6c 20 77 69 6e 64 6f  ples:  All windo
d060: 77 73 20 73 79 73 74 65 6d 73 2c 20 75 6e 69 78  ws systems, unix
d070: 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 75 73   systems with us
d080: 6c 65 65 70 28 29 20 2a 2f 0a 20 20 73 74 61 74  leep() */.  stat
d090: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
d0a0: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
d0b0: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
d0c0: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
d0d0: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
d0e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d0f0: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
d100: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
d110: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
d120: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
d130: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
d140: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
d150: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
d160: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
d170: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
d180: 74 6d 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  tmout = db->busy
d190: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
d1a0: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 23 69  elay, prior;..#i
d1b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d1c0: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
d1d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
d1e0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
d1f0: 65 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e,SQLITE_FCNTL_L
d200: 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 26 74 6d 6f  OCK_TIMEOUT,&tmo
d210: 75 74 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ut)==SQLITE_OK )
d220: 7b 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74 20  {.    if( count 
d230: 29 7b 0a 20 20 20 20 20 20 74 6d 6f 75 74 20 3d  ){.      tmout =
d240: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d250: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
d260: 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
d270: 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  TL_LOCK_TIMEOUT,
d280: 20 26 74 6d 6f 75 74 29 3b 0a 20 20 20 20 20 20   &tmout);.      
d290: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
d2a0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d2b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  n 1;.    }.  }.#
d2c0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d2d0: 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a  RAMETER(pFile);.
d2e0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
d2f0: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
d300: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
d310: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
d320: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
d330: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
d340: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
d350: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
d360: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
d370: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
d380: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
d390: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
d3a0: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
d3b0: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
d3c0: 61 79 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20  ay > tmout ){.  
d3d0: 20 20 64 65 6c 61 79 20 3d 20 74 6d 6f 75 74 20    delay = tmout 
d3e0: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
d3f0: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
d400: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
d410: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
d420: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
d430: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
d440: 6c 73 65 0a 20 20 2f 2a 20 54 68 69 73 20 63 61  lse.  /* This ca
d450: 73 65 20 66 6f 72 20 75 6e 69 78 20 73 79 73 74  se for unix syst
d460: 65 6d 73 20 74 68 61 74 20 6c 61 63 6b 20 75 73  ems that lack us
d470: 6c 65 65 70 28 29 20 73 75 70 70 6f 72 74 2e 20  leep() support. 
d480: 20 53 6c 65 65 70 69 6e 67 0a 20 20 2a 2a 20 6d   Sleeping.  ** m
d490: 75 73 74 20 62 65 20 64 6f 6e 65 20 69 6e 20 69  ust be done in i
d4a0: 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20 77 68 6f  ncrements of who
d4b0: 6c 65 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  le seconds */.  
d4c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
d4d0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
d4e0: 69 6e 74 20 74 6d 6f 75 74 20 3d 20 28 28 73 71  int tmout = ((sq
d4f0: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
d500: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 55 4e 55  syTimeout;.  UNU
d510: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46  SED_PARAMETER(pF
d520: 69 6c 65 29 3b 0a 20 20 69 66 28 20 28 63 6f 75  ile);.  if( (cou
d530: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 6d 6f  nt+1)*1000 > tmo
d540: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
d550: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d560: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
d570: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
d580: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
d590: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
d5a0: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
d5b0: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
d5c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d5d0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
d5e0: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 74 6f  ration failed to
d5f0: 20 61 63 71 75 69 72 65 20 61 0a 2a 2a 20 6c 6f   acquire a.** lo
d600: 63 6b 20 6f 6e 20 56 46 53 20 66 69 6c 65 20 70  ck on VFS file p
d610: 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  File..**.** If t
d620: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d630: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
d640: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
d650: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
d660: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
d670: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
d680: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
d690: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
d6a0: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
d6b0: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
d6c0: 6c 65 72 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ler *p, sqlite3_
d6d0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
d6e0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 2d  int rc;.  if( p-
d6f0: 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3d 3d 30  >xBusyHandler==0
d700: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
d710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d720: 20 70 2d 3e 62 45 78 74 72 61 46 69 6c 65 41 72   p->bExtraFileAr
d730: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  g ){.    /* Add 
d740: 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  an extra paramet
d750: 65 72 20 77 69 74 68 20 74 68 65 20 70 46 69 6c  er with the pFil
d760: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
d770: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
d780: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  ** callback argu
d790: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
d7a0: 20 69 6e 74 20 28 2a 78 54 72 61 29 28 76 6f 69   int (*xTra)(voi
d7b0: 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66  d*,int,sqlite3_f
d7c0: 69 6c 65 2a 29 3b 0a 20 20 20 20 78 54 72 61 20  ile*);.    xTra 
d7d0: 3d 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c  = (int(*)(void*,
d7e0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  int,sqlite3_file
d7f0: 2a 29 29 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c  *))p->xBusyHandl
d800: 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 78 54 72  er;.    rc = xTr
d810: 61 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70  a(p->pBusyArg, p
d820: 2d 3e 6e 42 75 73 79 2c 20 70 46 69 6c 65 29 3b  ->nBusy, pFile);
d830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
d840: 20 4c 65 67 61 63 79 20 73 74 79 6c 65 20 62 75   Legacy style bu
d850: 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy handler callb
d860: 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ack */.    rc = 
d870: 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  p->xBusyHandler(
d880: 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 2d 3e  p->pBusyArg, p->
d890: 6e 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  nBusy);.  }.  if
d8a0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
d8b0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
d8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
d8d0: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
d8e0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
d8f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
d900: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
d910: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
d920: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
d930: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
d940: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
d950: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
d960: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
d970: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
d980: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
d990: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
d9a0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
d9b0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
d9c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d9d0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d9e0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d9f0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
da00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
da10: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
da20: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
da30: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
da40: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
da50: 6e 64 6c 65 72 2e 78 42 75 73 79 48 61 6e 64 6c  ndler.xBusyHandl
da60: 65 72 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62  er = xBusy;.  db
da70: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 42  ->busyHandler.pB
da80: 75 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  usyArg = pArg;. 
da90: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
daa0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
dab0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45  ->busyHandler.bE
dac0: 78 74 72 61 46 69 6c 65 41 72 67 20 3d 20 30 3b  xtraFileArg = 0;
dad0: 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  .  db->busyTimeo
dae0: 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ut = 0;.  sqlite
daf0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
db00: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
db10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
db20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
db30: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
db40: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
db50: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
db60: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
db70: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
db80: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
db90: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
dba0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
dbb0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
dbc0: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
dbd0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
dbe0: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
dbf0: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
dc00: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
dc10: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
dc20: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
dc30: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
dc40: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
dc50: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
dc60: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
dc70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
dc80: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
dc90: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
dca0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
dcb0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
dcc0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
dcd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
dce0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
dcf0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
dd00: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
dd10: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
dd20: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
dd30: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
dd40: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e  rogressOps = (un
dd50: 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20  signed)nOps;.   
dd60: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
dd70: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
dd80: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
dd90: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
dda0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
ddb0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
ddc0: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
ddd0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
dde0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ddf0: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
de00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de10: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
de20: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
de30: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
de40: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
de50: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
de60: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
de70: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
de80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
de90: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
dea0: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23   *db, int ms){.#
deb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
dec0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ded0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
dee0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
def0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
df00: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
df10: 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  f.  if( ms>0 ){.
df20: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
df30: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 28 69 6e  _handler(db, (in
df40: 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  t(*)(void*,int))
df50: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
df60: 79 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20 20  yCallback,.     
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 64          (void*)d
df90: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
dfa0: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
dfb0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
dfc0: 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67 20  r.bExtraFileArg 
dfd0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
dfe0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
dff0: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
e000: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e010: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e020: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
e030: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
e040: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
e050: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
e060: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
e070: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
e080: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
e090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e0a0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e0b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e0c0: 68 65 63 6b 4f 6b 28 64 62 29 20 26 26 20 28 64  heckOk(db) && (d
e0d0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 67 69  b==0 || db->magi
e0e0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
e0f0: 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20 20 20 28  ZOMBIE) ){.    (
e100: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e110: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e120: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e130: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
e140: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
e150: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e160: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
e170: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
e180: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e190: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
e1a0: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
e1b0: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
e1c0: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
e1d0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
e1e0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
e1f0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
e200: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
e210: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
e220: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
e230: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
e240: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
e250: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
e260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
e270: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
e280: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e290: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
e2a0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
e2b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e2c0: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
e2d0: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e2e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e2f0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e300: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e310: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e320: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e330: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e340: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e350: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e360: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
e370: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
e380: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
e390: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
e3a0: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
e3b0: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
e3c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e3d0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
e3e0: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
e3f0: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
e400: 78 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  xSFunc && (xFina
e410: 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20  l || xStep)) || 
e420: 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e 63 20  .      (!xSFunc 
e430: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
e440: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
e450: 28 21 78 53 46 75 6e 63 20 26 26 20 28 21 78 46  (!xSFunc && (!xF
e460: 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20  inal && xStep)) 
e470: 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d  ||.      (nArg<-
e480: 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45  1 || nArg>SQLITE
e490: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
e4a0: 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35  G) ||.      (255
e4b0: 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  <(nName = sqlite
e4c0: 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63  3Strlen30( zFunc
e4d0: 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20  tionName))) ){. 
e4e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e4f0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e500: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  }..  assert( SQL
e510: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e  ITE_FUNC_CONSTAN
e520: 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  T==SQLITE_DETERM
e530: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74  INISTIC );.  ext
e540: 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20  raFlags = enc & 
e550: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
e560: 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20  ISTIC;.  enc &= 
e570: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43  (SQLITE_FUNC_ENC
e580: 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29  MASK|SQLITE_ANY)
e590: 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.  .#ifndef SQL
e5a0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
e5b0: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
e5c0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
e5d0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
e5e0: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
e5f0: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
e600: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
e610: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
e620: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
e630: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
e640: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
e650: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
e660: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
e670: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
e680: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
e690: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
e6a0: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
e6b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
e6c0: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
e6d0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
e6e0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
e6f0: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
e700: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
e710: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
e720: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
e730: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
e740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e750: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e760: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
e770: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78  , SQLITE_UTF8|ex
e780: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
e790: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53     pUserData, xS
e7a0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
e7b0: 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72  nal, pDestructor
e7c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e7d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e7e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e7f0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e800: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
e810: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
e820: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
e830: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
e840: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
e850: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
e860: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
e870: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e880: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
e890: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
e8a0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
e8b0: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
e8c0: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
e8d0: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
e8e0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
e8f0: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
e900: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
e910: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
e920: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
e930: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
e940: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
e950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
e960: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
e970: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
e980: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
e990: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
e9a0: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
e9b0: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
e9c0: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
e9d0: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
e9e0: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
e9f0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
ea00: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
ea10: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
ea20: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ea30: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
ea40: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70  );.  if( p && (p
ea50: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
ea60: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
ea70: 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  K)==enc && p->nA
ea80: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
ea90: 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
eaa0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
eab0: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
eac0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
ead0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
eae0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
eaf0: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
eb00: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
eb10: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
eb20: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
eb30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
eb40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
eb50: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
eb60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
eb70: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
eb80: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
eb90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
eba0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
ebb0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
ebc0: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  ionName, nArg, (
ebd0: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
ebe0: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
ebf0: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
ec00: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
ec10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ec20: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
ec30: 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72   If an older ver
ec40: 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63  sion of the func
ec50: 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66  tion with a conf
ec60: 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f  igured destructo
ec70: 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  r is.  ** being 
ec80: 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20  replaced invoke 
ec90: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
eca0: 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f  unction here. */
ecb0: 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  .  functionDestr
ecc0: 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66  oy(db, p);..  if
ecd0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
ece0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
ecf0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
ed00: 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72  p->u.pDestructor
ed10: 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a   = pDestructor;.
ed20: 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d    p->funcFlags =
ed30: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
ed40: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
ed50: 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61  MASK) | extraFla
ed60: 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  gs;.  testcase( 
ed70: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
ed80: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
ed90: 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75  TIC );.  p->xSFu
eda0: 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53  nc = xSFunc ? xS
edb0: 46 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20  Func : xStep;.  
edc0: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
edd0: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
ede0: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
edf0: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28  a;.  p->nArg = (
ee00: 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75  u16)nArg;.  retu
ee10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ee20: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
ee30: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
ee40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee50: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
ee60: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
ee70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ee80: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
ee90: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
eea0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
eeb0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
eec0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
eed0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
eee0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
eef0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ef00: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
ef10: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
ef20: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
ef30: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
ef40: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
ef50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
ef60: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
ef70: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75  rg, enc, p, xSFu
ef80: 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20  nc, xStep,.     
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
efb0: 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e  Final, 0);.}..in
efc0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
efd0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20  _function_v2(.  
efe0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
eff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
f000: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
f010: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
f020: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
f030: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
f040: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
f050: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
f060: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
f070: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f080: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
f090: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
f0a0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
f0b0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
f0c0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
f0d0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
f0e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
f0f0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
f100: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66   *pArg = 0;..#if
f110: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f120: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f130: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f140: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f160: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f170: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f180: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f190: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f1a0: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
f1b0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
f1c0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
f1d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
f1e0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
f1f0: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
f200: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
f210: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
f220: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
f230: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
f240: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
f250: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
f260: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
f270: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
f280: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
f290: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
f2a0: 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  p, xSFunc, xStep
f2b0: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
f2c0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
f2d0: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
f2e0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
f2f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
f300: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
f310: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f320: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
f330: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
f340: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
f350: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
f360: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f370: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f380: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
f390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
f3a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
f3b0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
f3c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f3d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
f3e0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
f3f0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
f400: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
f410: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
f420: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
f430: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f440: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
f450: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
f460: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
f480: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f490: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f4a0: 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  xt*).){.  int rc
f4b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38  ;.  char *zFunc8
f4c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f4d0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f4e0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f4f0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f500: 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  ) || zFunctionNa
f510: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
f520: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f530: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
f540: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f550: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
f560: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f570: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
f580: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
f590: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
f5a0: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  ionName, -1, SQL
f5b0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
f5c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
f5d0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
f5e0: 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65  Func8, nArg, eTe
f5f0: 78 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e 63  xtRep, p, xSFunc
f600: 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29  ,xStep,xFinal,0)
f610: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
f620: 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20  e(db, zFunc8);. 
f630: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
f640: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
f650: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f660: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
f680: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
f690: 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
f6a0: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
f6b0: 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
f6c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
f6d0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
f6e0: 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
f6f0: 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
f700: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
f710: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
f720: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
f730: 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
f740: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
f750: 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
f760: 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
f770: 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
f780: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
f790: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
f7a0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
f7b0: 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
f7c0: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
f7d0: 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
f7e0: 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
f7f0: 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
f800: 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
f810: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
f820: 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
f830: 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
f840: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
f850: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
f860: 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
f870: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
f880: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
f890: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
f8a0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
f8b0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
f8c0: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Arg.){.  int rc 
f8d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
f8e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f8f0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f900: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f910: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
f920: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67  zName==0 || nArg
f930: 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <-2 ){.    retur
f940: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
f950: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
f960: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f970: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f980: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
f990: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
f9a0: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
f9b0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
f9c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f9d0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
f9e0: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
f9f0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
fa20: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
fa30: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  n, 0, 0, 0);.  }
fa40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
fa50: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
fa60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fa70: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
fa80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fa90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
faa0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
fab0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
fac0: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
fad0: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
fae0: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
faf0: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
fb00: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
fb10: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
fb20: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
fb30: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
fb40: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
fb50: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
fb60: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
fb70: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
fb80: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
fb90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
fba0: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
fbb0: 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nt..*/.#ifndef S
fbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
fbd0: 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69  CATED.void *sqli
fbe0: 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65  te3_trace(sqlite
fbf0: 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72  3 *db, void(*xTr
fc00: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
fc10: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
fc20: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
fc30: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
fc40: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
fc50: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fc60: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
fc70: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fc80: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fc90: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fca0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fcb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fcc0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
fcd0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
fce0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54  aceArg;.  db->mT
fcf0: 72 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20  race = xTrace ? 
fd00: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47  SQLITE_TRACE_LEG
fd10: 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78  ACY : 0;.  db->x
fd20: 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28  Trace = (int(*)(
fd30: 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  u32,void*,void*,
fd40: 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20  void*))xTrace;. 
fd50: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
fd60: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
fd70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
fd80: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
fd90: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
fda0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fdb0: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f  DEPRECATED */../
fdc0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
fdd0: 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  ce callback usin
fde0: 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20  g the version-2 
fdf0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
fe00: 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f  t sqlite3_trace_
fe10: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
fe20: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63   /* Trace this c
fe50: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  onnection */.  u
fe60: 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20  nsigned mTrace, 
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
fe90: 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62  k of events to b
fea0: 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e  e traced */.  in
feb0: 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67  t(*xTrace)(unsig
fec0: 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ned,void*,void*,
fed0: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c  void*),  /* Call
fee0: 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a  back to invoke *
fef0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff20: 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  * Context */.){.
ff30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ff40: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ff50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ff60: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
ff70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ff80: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
ff90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
ffa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ffb0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ffc0: 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20  if( mTrace==0 ) 
ffd0: 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66  xTrace = 0;.  if
ffe0: 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54  ( xTrace==0 ) mT
fff0: 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  race = 0;.  db->
10000 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b  mTrace = mTrace;
10010 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
10020 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
10030 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
10040 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10050 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10060 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10070 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
10080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10090 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65  RECATED./*.** Re
100a0 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
100b0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
100c0 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
100d0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
100e0 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
100f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
10100 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
10110 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
10120 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
10130 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
10140 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
10150 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
10160 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
10170 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
10180 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
10190 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
101a0 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
101b0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
101c0 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
101d0 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
101e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
101f0 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
10200 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
10210 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
10220 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
10230 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
10240 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10250 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10260 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10270 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10280 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
10290 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
102a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
102b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
102c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
102d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
102e0 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
102f0 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
10300 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
10310 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
10320 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10340 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10350 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
10360 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10370 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20  OMIT_DEPRECATED 
10380 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
10390 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
103a0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
103b0 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
103c0 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
103d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
103e0 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  mmits..** If the
103f0 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
10400 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
10410 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
10420 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
10430 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
10440 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
10450 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
10460 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10470 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10480 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10490 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
104a0 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
104b0 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
104c0 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
104d0 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
104e0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10500 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
10510 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
10520 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
10530 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10540 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
10550 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
10560 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
10570 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
10580 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
10590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
105a0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
105b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
105c0 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
105d0 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
105e0 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
105f0 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
10600 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
10610 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
10620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10630 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10640 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
10650 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10660 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
10670 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
10680 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
10690 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
106a0 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
106b0 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
106c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
106d0 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
106e0 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
106f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10700 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
10710 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
10720 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
10730 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
10740 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
10750 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
10760 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
10770 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
107a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
107b0 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
107c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
107d0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
107e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
107f0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10800 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
10810 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10820 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10830 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
10840 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10850 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
10860 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65  et = db->pUpdate
10870 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61  Arg;.  db->xUpda
10880 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
10890 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55  llback;.  db->pU
108a0 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
108b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
108c0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
108d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
108e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
108f0 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
10900 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
10910 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
10920 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a  tion is rolled.*
10930 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64  * back by this d
10940 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10950 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
10960 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
10970 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
10980 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10990 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
109a0 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
109b0 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
109c0 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
109d0 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66  ), /* Callback f
109e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
109f0 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
10a00 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
10a10 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
10a20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
10a30 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
10a40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10a50 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10a60 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10a70 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
10a80 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
10a90 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
10aa0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
10ab0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10ac0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10ad0 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
10ae0 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
10af0 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
10b00 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
10b10 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
10b20 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
10b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10b40 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10b50 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
10b60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10b70 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
10b80 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69  _HOOK./*.** Regi
10b90 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
10ba0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
10bb0 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
10bc0 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
10bd0 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
10be0 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
10bf0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
10c00 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
10c10 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
10c20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c40 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10c50 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
10c60 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61  e */.  void(*xCa
10c70 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20  llback)(        
10c80 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
10c90 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69  ction */.    voi
10ca0 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c  d*,sqlite3*,int,
10cb0 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72  char const*,char
10cc0 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f   const*,sqlite3_
10cd0 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e  int64,sqlite3_in
10ce0 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
10cf0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
10d00 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62    /* First callb
10d10 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ack argument */.
10d20 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
10d30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10d40 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10d50 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
10d60 70 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20  pPreUpdateArg;. 
10d70 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
10d80 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
10d90 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  ack;.  db->pPreU
10da0 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
10db0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10dc0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
10de0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10df0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
10e00 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
10e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e20 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
10e30 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
10e40 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
10e50 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
10e60 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
10e70 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
10e80 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
10e90 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
10ea0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
10eb0 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
10ec0 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
10ed0 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
10ee0 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
10ef0 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
10f00 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
10f10 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
10f20 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
10f30 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
10f40 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
10f50 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
10f60 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
10f70 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
10f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10f90 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
10fa0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
10fb0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
10fc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fe0 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
10ff0 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
11000 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
11010 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
11020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
11030 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
11050 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
11060 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
11070 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11080 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
11090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
110a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
110b0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
110c0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
110d0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
110e0 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
110f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
11100 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
11110 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
11120 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
11130 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
11140 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
11150 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
11160 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
11170 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
11180 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
11190 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
111a0 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
111b0 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
111c0 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
111d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
111e0 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
111f0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
11200 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
11210 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
11220 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
11230 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
11240 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
11250 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
11260 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
11270 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
11280 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
11290 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
112a0 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
112b0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
112c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
112d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
112e0 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
112f0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
11300 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
11310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
11320 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
11330 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
11340 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
11350 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66  rame);.#else.#if
11360 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11370 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
11380 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
11390 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
113a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
113b0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
113c0 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
113d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
113e0 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
113f0 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
11400 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
11410 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
11420 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11430 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
11440 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
11450 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
11460 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11470 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
11480 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
11490 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
114a0 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
114b0 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
114c0 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
114d0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
114e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
114f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
11500 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
11510 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
11530 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
11540 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
11550 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
11560 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
11570 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
11580 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
11590 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
115a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
115b0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
115c0 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
115d0 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
115e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
115f0 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23  .  void *pRet;.#
11600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11610 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
11620 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11630 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
11640 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
11650 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11660 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11670 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11680 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11690 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
116a0 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
116b0 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
116c0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
116d0 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
116e0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
116f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11700 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11710 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
11720 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
11730 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  }../*.** Checkpo
11740 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
11750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11760 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
11770 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
11780 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
11790 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
117a0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
117b0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117d0 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65   Name of attache
117e0 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e  d database (or N
117f0 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  ULL) */.  int eM
11800 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
11810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
11820 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a  ITE_CHECKPOINT_*
11830 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
11840 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20  *pnLog,         
11850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11860 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20  UT: Size of WAL 
11870 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f  log in frames */
11880 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20  .  int *pnCkpt  
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
118b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
118c0 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a  s checkpointed *
118d0 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
118e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65  TE_OMIT_WAL.  re
118f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11900 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20  #else.  int rc; 
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11930 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
11940 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  iDb = SQLITE_MAX
11950 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73  _ATTACHED;  /* s
11960 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64  qlite3.aDb[] ind
11970 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63  ex of db to chec
11980 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  kpoint */..#ifde
11990 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
119a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
119b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
119c0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
119d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
119e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20  _BKPT;.#endif.. 
119f0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
11a00 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
11a10 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
11a20 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
11a30 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
11a40 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
11a50 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
11a60 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
11a70 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
11a80 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
11a90 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
11aa0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
11ab0 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
11ac0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
11ad0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
11ae0 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  ART==2 );.  asse
11af0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
11b00 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d  POINT_TRUNCATE==
11b10 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  3 );.  if( eMode
11b20 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
11b30 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
11b40 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
11b50 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29  POINT_TRUNCATE )
11b60 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
11b70 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32  E-OF: R-03996-12
11b80 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65  088 The M parame
11b90 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61  ter must be a va
11ba0 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20  lid checkpoint. 
11bb0 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20     ** mode: */. 
11bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11bd0 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
11be0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11bf0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11c00 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
11c10 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
11c20 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
11c30 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
11c40 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
11c50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c60 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
11c70 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
11c80 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
11c90 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
11ca0 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  se: %s", zDb);. 
11cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
11cc0 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
11cd0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
11ce0 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
11cf0 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
11d00 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
11d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
11d20 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
11d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
11d40 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a  iExit(db, rc);..
11d50 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
11d60 65 20 6e 6f 20 61 63 74 69 76 65 20 73 74 61 74  e no active stat
11d70 65 6d 65 6e 74 73 2c 20 63 6c 65 61 72 20 74 68  ements, clear th
11d80 65 20 69 6e 74 65 72 72 75 70 74 20 66 6c 61 67  e interrupt flag
11d90 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
11da0 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64  int.  */.  if( d
11db0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d  b->nVdbeActive==
11dc0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e  0 ){.    db->u1.
11dd0 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
11de0 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  0;.  }..  sqlite
11df0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11e00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11e10 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11e20 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
11e30 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
11e40 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c   If zDb is NULL,
11e50 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65   or if the buffe
11e60 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20  r zDb points.** 
11e70 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65  to contains a ze
11e80 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ro-length string
11e90 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  , all attached d
11ea0 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a  atabases are .**
11eb0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
11ec0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
11ed0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
11ee0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
11ef0 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a  char *zDb){.  /*
11f00 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11f10 34 31 36 31 33 2d 32 30 35 35 33 20 54 68 65 20  41613-20553 The 
11f20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11f30 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65  kpoint(D,X) is e
11f40 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a  quivalent to.  *
11f50 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  * sqlite3_wal_ch
11f60 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c  eckpoint_v2(D,X,
11f70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11f80 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20  T_PASSIVE,0,0). 
11f90 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
11fa0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11fb0 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c  nt_v2(db,zDb,SQL
11fc0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
11fd0 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a  ASSIVE,0,0);.}..
11fe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ff0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
12000 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
12010 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
12020 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
12030 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
12040 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
12050 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
12060 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
12070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12080 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
12090 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
120a0 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
120b0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
120c0 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
120d0 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
120e0 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
120f0 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
12100 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12110 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
12120 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
12130 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
12140 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
12150 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
12160 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
12170 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
12180 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
12190 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
121a0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
121b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
121c0 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
121d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
121e0 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
121f0 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
12200 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
12210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
12220 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
12230 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
12240 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
12250 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
12260 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
12270 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
12280 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
12290 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
122a0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
122b0 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
122c0 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
122d0 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
122e0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
122f0 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
12300 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
12310 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
12320 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
12330 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12340 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
12350 2c 20 52 45 53 54 41 52 54 0a 2a 2a 20 6f 72 20  , RESTART.** or 
12360 54 52 55 4e 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74  TRUNCATE..*/.int
12370 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
12380 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
12390 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f  int iDb, int eMo
123a0 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  de, int *pnLog, 
123b0 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20  int *pnCkpt){.  
123c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
123d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
123e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
123f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
12420 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
12430 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20  ttached dbs */. 
12440 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20   int bBusy = 0; 
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49   /* True if SQLI
12470 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e  TE_BUSY has been
12480 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
12490 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
124a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
124b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
124c0 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20  sert( !pnLog || 
124d0 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20  *pnLog==-1 );.  
124e0 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20  assert( !pnCkpt 
124f0 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29  || *pnCkpt==-1 )
12500 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
12510 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53  db->nDb && rc==S
12520 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
12530 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c      if( i==iDb |
12540 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41  | iDb==SQLITE_MA
12550 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20  X_ATTACHED ){.  
12560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12570 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28  BtreeCheckpoint(
12580 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20  db->aDb[i].pBt, 
12590 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
125a0 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c  Ckpt);.      pnL
125b0 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e  og = 0;.      pn
125c0 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Ckpt = 0;.      
125d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
125e0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62  USY ){.        b
125f0 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
12600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12620 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
12630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12640 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f  bBusy) ? SQLITE_
12650 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e  BUSY : rc;.}.#en
12660 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12670 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
12680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
12690 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d  eturns true if m
126a0 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c  ain-memory shoul
126b0 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  d be used instea
126c0 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  d of.** a tempor
126d0 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61  ary file for tra
126e0 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c  nsient pager fil
126f0 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  es and statement
12700 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
12710 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12720 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
12730 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d  value of db->tem
12740 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65  p_store (runtime
12750 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61  .** parameter) a
12760 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74  nd the compile t
12770 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
12780 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20  ITE_TEMP_STORE. 
12790 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
127a0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
127b0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
127c0 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20  p between these 
127d0 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e  two values.** an
127e0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73  d this functions
127f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
12800 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45  *.**   SQLITE_TE
12810 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d  MP_STORE     db-
12820 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20  >temp_store     
12830 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70  Location of temp
12840 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  orary database.*
12850 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
12860 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
12870 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
12880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
128a0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
128b0 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
128c0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
128d0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
128e0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
128f0 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
12910 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
12920 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12950 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
12960 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 1).**   1     
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
12990 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
129a0 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
129d0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
129e0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
129f0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
12a00 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
12a10 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
12a20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
12a30 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12a40 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
12a50 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
12a60 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
12a70 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
12a80 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
12aa0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
12ab0 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1).*/.int sqlit
12ac0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63  e3TempInMemory(c
12ad0 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62  onst sqlite3 *db
12ae0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
12af0 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65  MP_STORE==1.  re
12b00 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
12b10 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64  store==2 );.#end
12b20 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
12b30 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65  MP_STORE==2.  re
12b40 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
12b50 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64  store!=1 );.#end
12b60 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
12b70 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e  MP_STORE==3.  UN
12b80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
12b90 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
12ba0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12bb0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
12bc0 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
12bd0 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50  ORE>3.  UNUSED_P
12be0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
12bf0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
12c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12c10 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
12c20 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
12c30 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
12c40 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
12c50 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
12c60 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
12c70 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
12c80 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
12c90 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
12ca0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
12cb0 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
12cc0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
12cd0 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
12ce0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
12cf0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
12d00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
12d10 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
12d20 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
12d30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12d40 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12d50 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
12d60 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
12d70 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
12d80 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  (SQLITE_NOMEM_BK
12d90 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PT);.  }else{.  
12da0 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
12db0 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a  pErr==0 );.    z
12dc0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
12dd0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
12de0 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
12df0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
12e00 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
12e10 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
12e20 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
12e30 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
12e40 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
12e50 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12e60 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12e70 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
12e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
12e90 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
12ea0 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
12eb0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
12ec0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
12ed0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
12ee0 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
12ef0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
12f00 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
12f10 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
12f20 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
12f30 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
12f40 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
12f50 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
12f60 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
12f70 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
12f80 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
12f90 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
12fa0 5d 20 3d 20 7b 0a 20 20 20 20 27 62 27 2c 20 27  ] = {.    'b', '
12fb0 61 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 27 70  a', 'd', ' ', 'p
12fc0 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 61 27  ', 'a', 'r', 'a'
12fd0 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c  , 'm', 'e', 't',
12fe0 20 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a   'e', 'r', ' ',.
12ff0 20 20 20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20      'o', 'r', ' 
13000 27 2c 20 27 6f 27 2c 20 27 74 27 2c 20 27 68 27  ', 'o', 't', 'h'
13010 2c 20 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c  , 'e', 'r', ' ',
13020 20 27 41 27 2c 20 27 50 27 2c 20 27 49 27 2c 20   'A', 'P', 'I', 
13030 27 20 27 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69  ' ',.    'm', 'i
13040 27 2c 20 27 73 27 2c 20 27 75 27 2c 20 27 73 27  ', 's', 'u', 's'
13050 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
13060 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
13070 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
13080 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
13090 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
130a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
130b0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
130c0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
130d0 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
130e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
130f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13100 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
13110 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13120 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
13130 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
13140 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
13150 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13160 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
13170 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
13180 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
13190 69 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65  ithMsg(db, db->e
131a0 72 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45  rrCode, sqlite3E
131b0 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
131c0 65 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  e));.      z = s
131d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
131e0 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
131f0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61     }.    /* A ma
13200 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20  lloc() may have 
13210 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68  failed within th
13220 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
13230 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
13240 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49  .    ** above. I
13250 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
13260 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d  se, then the db-
13270 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
13280 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  ag needs to.    
13290 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  ** be cleared be
132a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
132b0 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79  Do this directly
132c0 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61  , instead of via
132d0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41  .    ** sqlite3A
132e0 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f  piExit(), to avo
132f0 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64  id setting the d
13300 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65  atabase handle e
13310 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20  rror message..  
13320 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
13330 4f 6f 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20  OomClear(db);.  
13340 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13350 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13360 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
13370 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13380 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
13390 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
133a0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
133b0 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
133c0 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
133d0 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
133e0 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
133f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
13400 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
13410 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
13420 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
13430 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
13440 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
13450 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
13460 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
13470 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
13480 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
13490 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
134a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
134b0 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
134c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
134d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
134e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
134f0 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
13500 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
13510 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
13520 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
13530 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13540 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
13550 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
13560 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
13570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13580 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
13590 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
135a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
135b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
135c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
135d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
135e0 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20  >errCode;.}.int 
135f0 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65  sqlite3_system_e
13600 72 72 6e 6f 28 73 71 6c 69 74 65 33 20 2a 64 62  rrno(sqlite3 *db
13610 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 20 3f  ){.  return db ?
13620 20 64 62 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a   db->iSysErrno :
13630 20 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52   0;.}  ../*.** R
13640 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
13650 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
13660 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
13670 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
13680 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
13690 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
136a0 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
136b0 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
136c0 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
136d0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
136e0 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
136f0 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
13700 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
13710 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
13720 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
13730 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
13740 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
13750 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
13760 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
13770 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
13780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13790 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
137a0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
137b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
137c0 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
137d0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
137e0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
137f0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
13800 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
13810 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
13820 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
13830 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
13840 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a  .  int enc2;.  .
13850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13860 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
13870 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
13880 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
13890 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
138a0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
138b0 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
138c0 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
138d0 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
138e0 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
138f0 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
13900 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
13910 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
13920 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
13930 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
13940 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65  .  */.  enc2 = e
13950 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  nc;.  testcase( 
13960 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
13970 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  16 );.  testcase
13980 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
13990 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a  TF16_ALIGNED );.
139a0 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49    if( enc2==SQLI
139b0 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32  TE_UTF16 || enc2
139c0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
139d0 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e  LIGNED ){.    en
139e0 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  c2 = SQLITE_UTF1
139f0 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69  6NATIVE;.  }.  i
13a00 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55  f( enc2<SQLITE_U
13a10 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49  TF8 || enc2>SQLI
13a20 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20  TE_UTF16BE ){.  
13a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a40 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
13a50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
13a60 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d  this call is rem
13a70 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69  oving or replaci
13a80 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63  ng an existing c
13a90 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73  ollation .  ** s
13aa0 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20  equence. If so, 
13ab0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
13ac0 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e  tive VMs, return
13ad0 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a   busy. If there.
13ae0 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69    ** are no acti
13af0 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61  ve VMs, invalida
13b00 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69  te any pre-compi
13b10 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
13b20 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    */.  pColl = s
13b30 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
13b40 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
13b50 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
13b60 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
13b70 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
13b80 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
13b90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13ba0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
13bb0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
13bc0 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
13bd0 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
13be0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13bf0 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
13c00 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
13c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13c20 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
13c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
13c40 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
13c50 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
13c60 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
13c70 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
13c80 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
13c90 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
13ca0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
13cb0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
13cc0 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
13cd0 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
13ce0 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
13cf0 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
13d00 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
13d10 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
13d20 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
13d30 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
13d40 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
13d50 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
13d60 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
13d70 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
13d80 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
13d90 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
13da0 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
13db0 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
13dc0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
13dd0 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
13de0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
13df0 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
13e00 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
13e10 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
13e20 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
13e30 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
13e40 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
13e50 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
13e60 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
13e70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
13e80 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
13e90 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
13ea0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
13eb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
13ec0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
13ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13ee0 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
13ef0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
13f00 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
13f10 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
13f20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
13f30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
13f40 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  KPT;.  pColl->xC
13f50 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
13f60 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
13f70 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
13f80 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
13f90 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
13fa0 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
13fb0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
13fc0 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
13fd0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
13fe0 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
13ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
14000 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
14010 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
14020 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
14030 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
14040 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
14050 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
14060 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
14070 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
14080 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
14090 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
140a0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
140b0 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
140c0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
140d0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
140e0 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
140f0 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
14100 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
14110 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
14120 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
14130 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
14140 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
14150 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14160 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
14170 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
14180 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
14190 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
141a0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
141b0 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
141c0 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
141d0 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
141e0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
141f0 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
14200 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
14210 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
14220 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
14230 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
14240 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
14250 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
14260 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
14270 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
14280 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
14290 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
142a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
142b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
142c0 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
142d0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
142e0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
142f0 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
14300 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
14310 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
14320 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
14330 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
14340 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
14350 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
14360 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
14370 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
14380 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
14390 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
143a0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
143b0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
143c0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
143d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
143e0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
143f0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
14400 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
14410 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
14420 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14430 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
14440 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
14450 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
14460 3e 31 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  >127.# error SQL
14470 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
14480 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
14490 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23  ween 0 and 127.#
144a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
144b0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
144c0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
144d0 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72  TACHED>125.# err
144e0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
144f0 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
14500 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35  etween 0 and 125
14510 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14520 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
14530 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65  ERN_LENGTH<1.# e
14540 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
14550 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
14560 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
14570 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
14580 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
14590 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
145a0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
145b0 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
145c0 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
145d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
145e0 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a  TRIGGER_DEPTH<1.
145f0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
14600 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
14610 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
14620 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
14630 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
14640 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51  _THREADS<0 || SQ
14650 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
14660 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72  THREADS>50.# err
14670 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  or SQLITE_MAX_WO
14680 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73  RKER_THREADS mus
14690 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
146a0 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  nd 50.#endif.../
146b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
146c0 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
146d0 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
146e0 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
146f0 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
14700 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
14710 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
14720 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
14730 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
14740 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
14750 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
14760 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
14770 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
14780 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
14790 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
147a0 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
147b0 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
147c0 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
147d0 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
147e0 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
147f0 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
14800 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
14810 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
14820 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
14830 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
14840 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20  dLimit;..#ifdef 
14850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
14860 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
14870 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
14880 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
14890 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
148a0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
148b0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
148c0 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  if..  /* EVIDENC
148d0 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34  E-OF: R-30189-54
148e0 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d  097 For each lim
148f0 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49  it category SQLI
14900 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20  TE_LIMIT_NAME.  
14910 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61  ** there is a ha
14920 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73  rd upper bound s
14930 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  et at compile-ti
14940 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f  me by a C prepro
14950 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72  cessor.  ** macr
14960 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f  o called SQLITE_
14970 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22  MAX_NAME. (The "
14980 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20  _LIMIT_" in the 
14990 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20  name is changed 
149a0 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e  to.  ** "_MAX_".
149b0 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
149c0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
149d0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
149e0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  ==SQLITE_MAX_LEN
149f0 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
14a00 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
14a10 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
14a20 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
14a30 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _SQL_LENGTH );. 
14a40 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14a50 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14a60 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45  _COLUMN]==SQLITE
14a70 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _MAX_COLUMN );. 
14a80 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14a90 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14aa0 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51  _EXPR_DEPTH]==SQ
14ab0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
14ac0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
14ad0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
14ae0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
14af0 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54  D_SELECT]==SQLIT
14b00 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
14b10 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74  ELECT);.  assert
14b20 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
14b30 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
14b40 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  P]==SQLITE_MAX_V
14b50 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65  DBE_OP );.  asse
14b60 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14b70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
14b80 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54  TION_ARG]==SQLIT
14b90 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14ba0 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RG );.  assert( 
14bb0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14bc0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
14bd0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ]==SQLITE_MAX_AT
14be0 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65  TACHED );.  asse
14bf0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14c00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
14c10 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
14c20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
14c60 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
14c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
14c80 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14c90 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
14ca0 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d  UMBER]==SQLITE_M
14cb0 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
14cc0 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ER);.  assert( a
14cd0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14ce0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
14cf0 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
14d00 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
14d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14d20 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14d30 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
14d40 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ADS]==SQLITE_MAX
14d50 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
14d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
14d70 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
14d80 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54  _THREADS==(SQLIT
14d90 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a  E_N_LIMIT-1) );.
14da0 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ..  if( limitId<
14db0 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
14dc0 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
14dd0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
14de0 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
14df0 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
14e00 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
14e10 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20  mit>=0 ){       
14e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14e30 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33  MP: R-52476-2873
14e40 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77  2 */.    if( new
14e50 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
14e60 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
14e70 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
14e80 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
14e90 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ];  /* IMP: R-51
14ea0 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20  463-25634 */.   
14eb0 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69   }.    db->aLimi
14ec0 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77  t[limitId] = new
14ed0 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
14ee0 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20  urn oldLimit;   
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34    /* IMP: R-5334
14f10 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a  1-35419 */.}../*
14f20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14f30 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
14f40 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
14f50 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
14f60 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
14f70 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
14f80 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
14f90 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
14fa0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
14fb0 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
14fc0 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
14fd0 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
14fe0 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
14ff0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15000 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15010 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
15020 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
15030 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
15040 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
15050 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
15060 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
15070 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
15080 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
15090 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
150a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
150b0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
150c0 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
150d0 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
150e0 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
150f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15100 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
15110 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
15120 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
15130 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
15140 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
15150 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
15160 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
15170 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
15180 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
15190 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
151a0 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
151b0 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
151c0 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
151d0 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
151e0 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
151f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
15200 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15210 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
15220 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
15230 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
15240 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
15250 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
15260 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15270 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
15280 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
15290 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
152a0 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
152b0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
152c0 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
152d0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
152e0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
152f0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
15300 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
15310 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
15320 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
15330 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15340 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
15350 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
15360 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
15370 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
15380 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
15390 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
153a0 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
153b0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
153c0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
153d0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
153e0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
153f0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
15400 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
15410 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
15420 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
15430 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
15440 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
15450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
15460 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
15470 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
15480 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
15490 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
154a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
154b0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
154c0 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
154d0 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
154e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
154f0 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
15500 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
15510 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
15520 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
15530 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
15540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15550 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
15560 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
15570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15580 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
15590 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
155a0 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
155b0 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
155c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
155d0 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
155e0 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
155f0 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
15600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15610 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
15620 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
15630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
15640 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
15650 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
15660 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
15670 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
15680 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
15690 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
156a0 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
156b0 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
156c0 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20  E_OPEN_URI)     
156d0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
156e0 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f  R-48725-32206 */
156f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
15700 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15710 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a  fig.bOpenUri) /*
15720 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36   IMP: R-51689-46
15730 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72  548 */.   && nUr
15740 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a  i>=5 && memcmp(z
15750 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29  Uri, "file:", 5)
15760 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37  ==0 /* IMP: R-57
15770 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29  884-37496 */.  )
15780 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
15790 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
157a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157b0 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
157c0 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
157d0 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
157e0 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
157f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
15800 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
15810 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
15820 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
15830 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
15840 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
15850 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79  x */.    u64 nBy
15860 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
15870 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
15880 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
15890 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
158a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
158b0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
158c0 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
158d0 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
158e0 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
158f0 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
15900 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
15910 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
15920 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
15930 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
15940 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
15950 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
15960 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
15970 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
15980 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
15990 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
159a0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
159b0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
159c0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
159d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
159e0 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69  .    iIn = 5;.#i
159f0 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
15a00 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
15a10 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
15a20 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+5, "///", 3
15a30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49  )==0 ){.      iI
15a40 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20  n = 7;.      /* 
15a50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
15a60 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55  ndition causes U
15a70 52 49 73 20 77 69 74 68 20 66 69 76 65 20 6c 65  RIs with five le
15a80 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65  ading / characte
15a90 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65  rs.      ** like
15aa0 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f   file://///host/
15ab0 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65  path to be conve
15ac0 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c  rted into UNCs l
15ad0 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e  ike //host/path.
15ae0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f  .      ** The co
15af0 72 72 65 63 74 20 55 52 49 20 66 6f 72 20 74 68  rrect URI for th
15b00 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20  at UNC has only 
15b10 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64  two or four lead
15b20 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
15b30 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f  .      ** file:/
15b40 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69  /host/path or fi
15b50 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  le:////host/path
15b60 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67  .  But 5 leading
15b70 20 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20   slashes is a . 
15b80 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65       ** common e
15b90 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c  rror, we are tol
15ba0 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20  d, so we handle 
15bb0 69 74 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  it as a special 
15bc0 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  case. */.      i
15bd0 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
15be0 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  7, "///", 3)==0 
15bf0 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ){ iIn++; }.    
15c00 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
15c10 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63  p(zUri+5, "//loc
15c20 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30  alhost/", 12)==0
15c30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
15c40 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  16;.    }.#else.
15c50 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
15c60 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
15c70 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
15c80 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
15c90 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
15ca0 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
15cb0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
15cc0 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
15cd0 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
15ce0 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
15cf0 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
15d00 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
15d10 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
15d20 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
15d30 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
15d40 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
15d50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15d60 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
15d70 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
15d80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
15d90 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
15da0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15db0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15dc0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
15dd0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
15de0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
15df0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
15e00 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
15e10 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
15e20 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
15e30 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
15e40 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
15e50 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
15e60 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
15e70 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
15e80 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
15e90 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
15ea0 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
15eb0 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
15ec0 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
15ed0 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
15ee0 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
15ef0 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
15f00 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
15f10 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
15f20 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
15f30 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
15f40 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
15f50 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
15f60 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
15f70 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
15f80 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
15f90 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
15fa0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
15fb0 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
15fc0 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
15fd0 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
15fe0 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
15ff0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
16000 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
16010 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
16020 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
16030 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
16040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
16050 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
16060 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
16070 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
16080 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
16090 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
160a0 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
160b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
160c0 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
160d0 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
160e0 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
160f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16100 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52  ENABLE_URI_00_ER
16110 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ROR.          /*
16120 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
16130 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22  taken when "%00"
16140 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20   appears within 
16150 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73  the URI. In this
16160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
16170 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c  se we ignore all
16180 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d   text in the rem
16190 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61  ainder of the pa
161a0 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20  th, name or.    
161b0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63        ** value c
161c0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
161d0 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65  arsed. So ignore
161e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
161f0 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20 20  racter.         
16200 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20   ** and skip to 
16210 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d  the next "?", "=
16220 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70  " or "&", as app
16230 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20  ropriate. */.   
16240 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
16250 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
16260 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20   && c!='#' .    
16270 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
16280 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f  tate!=0 || c!='?
16290 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
162a0 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c   && (eState!=1 |
162b0 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d  | (c!='=' && c!=
162c0 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20 20  '&')).          
162d0 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
162e0 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20  2 || c!='&').   
162f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
16300 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
16310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16320 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c     continue;.#el
16330 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se.          /* 
16340 49 66 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30  If ENABLE_URI_00
16350 5f 45 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65  _ERROR is define
16360 64 2c 20 22 25 30 30 22 20 69 6e 20 61 20 55 52  d, "%00" in a UR
16370 49 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a  I is an error. *
16380 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45  /.          *pzE
16390 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
163a0 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63  mprintf("unexpec
163b0 74 65 64 20 25 25 30 30 20 69 6e 20 75 72 69 22  ted %%00 in uri"
163c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
163d0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
163e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
163f0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65  arse_uri_out;.#e
16400 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
16410 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
16420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
16430 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
16440 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
16450 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
16460 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
16470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
16480 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
16490 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
164a0 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
164b0 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
164c0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
164d0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
164e0 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
164f0 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
16500 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
16510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
16520 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
16530 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
16540 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
16550 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
16560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16570 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
16580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
16590 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
165a0 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
165b0 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
165c0 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
165d0 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
165e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
165f0 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
16600 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
16610 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
16620 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
16630 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
16640 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
16650 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
16660 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
16670 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
16680 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
16690 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
166a0 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
166b0 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
166c0 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
166d0 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
166e0 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
166f0 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
16700 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
16710 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
16720 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
16730 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
16740 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
16750 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
16760 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
16770 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
16780 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
16790 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
167a0 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
167b0 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
167c0 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
167d0 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
167e0 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
167f0 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
16800 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
16810 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16820 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
16830 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
16840 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
16850 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
16860 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
16870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16880 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
16890 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
168a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
168b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
168c0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
168d0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
168e0 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
168f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
16900 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
16910 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
16920 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
16930 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
16940 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
16950 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
16960 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
16970 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
16980 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
16990 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
169a0 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
169b0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
169c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
169d0 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
169e0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
169f0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
16a00 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
16a10 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
16a20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
16a30 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
16a40 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
16a50 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
16a60 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
16a70 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
16a80 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
16a90 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
16aa0 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
16ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16ac0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
16ad0 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
16ae0 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
16af0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
16b00 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
16b10 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
16b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
16b30 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
16b40 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
16b50 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
16b60 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
16b70 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
16b80 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
16b90 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
16ba0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
16bb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
16bd0 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
16be0 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
16bf0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
16c00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
16c10 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
16c20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
16c30 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
16c40 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
16c70 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
16c80 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
16c90 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
16ca0 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
16cb0 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
16cc0 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
16cd0 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
16ce0 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
16cf0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
16d00 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
16d10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
16d20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
16d30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
16d40 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
16d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16d60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16d70 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
16d80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16d90 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
16da0 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
16db0 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
16dc0 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16dd0 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
16de0 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
16df0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
16e10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16e20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
16e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16e40 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
16e50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
16e60 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
16e70 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
16e80 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
16e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
16ea0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
16eb0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
16ec0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
16ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
16ee0 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
16ef0 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
16f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16f10 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
16f20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
16f30 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
16f40 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
16f70 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
16f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
16f90 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
16fa0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
16fb0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
16fc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16fd0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
16fe0 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
16ff0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
17000 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
17010 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
17020 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
17030 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
17040 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
17050 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
17060 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
17070 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
17080 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  KPT;.    if( nUr
17090 69 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  i ){.      memcp
170a0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
170b0 55 72 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Uri);.    }.    
170c0 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c  zFile[nUri] = '\
170d0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  0';.    zFile[nU
170e0 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ri+1] = '\0';.  
170f0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
17100 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d  TE_OPEN_URI;.  }
17110 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
17120 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
17130 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
17140 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
17150 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17160 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17170 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
17180 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17190 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
171a0 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
171b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
171c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
171d0 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
171e0 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
171f0 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
17200 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
17210 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
17220 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
17230 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
17240 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
17250 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
17260 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
17270 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
17280 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
17290 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
172a0 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
172b0 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
172c0 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
172d0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
172e0 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
172f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
17300 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
17310 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
17320 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
17330 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
17340 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
17350 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17360 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
17370 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20  nt flags,    /* 
17380 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
17390 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
173a0 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
173b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
173c0 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
173d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74  /* Store allocat
17400 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  ed handle here *
17410 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
17440 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68  de */.  int isTh
17450 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20  readsafe;       
17460 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17470 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63  for threadsafe c
17480 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
17490 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b  char *zOpen = 0;
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  /* Filename argu
174c0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
174d0 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20  BtreeOpen() */. 
174e0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
174f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17500 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
17510 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61  e from sqlite3Pa
17520 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66  rseUri() */..#if
17530 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17540 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
17550 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75  ( ppDb==0 ) retu
17560 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
17570 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
17580 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
17590 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
175a0 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
175b0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
175c0 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
175d0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
175e0 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
175f0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
17600 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
17610 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
17620 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
17630 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17640 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
17650 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
17660 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
17670 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
17680 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
17690 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
176a0 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
176b0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
176c0 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
176d0 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
176e0 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66  ex;.  }..  if( f
176f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
17700 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
17710 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
17720 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
17730 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
17740 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
17750 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
17760 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
17770 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
17780 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
17790 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
177a0 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
177b0 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
177c0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
177d0 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
177e0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
177f0 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
17800 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
17810 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
17820 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
17830 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
17840 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
17850 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
17860 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
17870 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
17880 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
17890 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
178a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
178b0 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
178c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
178d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
178e0 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
178f0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
17900 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
17910 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
17920 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
17930 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
17940 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
17950 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
17960 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
17970 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
17980 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17990 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
179b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
179c0 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
179d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
179e0 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
179f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17a00 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
17a10 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
17a20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17a30 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
17a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
17a60 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
17a70 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17a80 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
17a90 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
17aa0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17ab0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
17ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
17ae0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
17af0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17b00 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
17b10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17b20 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
17b30 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
17b40 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
17b50 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
17b60 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
17b70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
17b80 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
17b90 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
17ba0 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
17bb0 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
17bc0 61 64 73 61 66 65 20 0a 23 69 66 64 65 66 20 53  adsafe .#ifdef S
17bd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c  QLITE_ENABLE_MUL
17be0 54 49 54 48 52 45 41 44 45 44 5f 43 48 45 43 4b  TITHREADED_CHECK
17bf0 53 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47  S.   || sqlite3G
17c00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
17c10 65 4d 75 74 65 78 0a 23 65 6e 64 69 66 0a 20 20  eMutex.#endif.  
17c20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
17c30 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
17c40 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
17c50 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
17c60 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
17c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17c80 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
17c90 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
17ca0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
17cb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
17cc0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
17cd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17ce0 33 4d 75 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74  3MutexWarnOnCont
17cf0 65 6e 74 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78  ention(db->mutex
17d00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
17d10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17d20 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17d30 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
17d40 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
17d50 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
17d60 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
17d70 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
17d80 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
17d90 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
17da0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
17db0 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
17dc0 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
17dd0 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
17de0 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
17df0 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
17e00 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
17e10 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
17e20 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45  ADS] = SQLITE_DE
17e30 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52  FAULT_WORKER_THR
17e40 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  EADS;.  db->auto
17e50 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
17e60 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
17e70 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70  -1;.  db->szMmap
17e80 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
17e90 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20  Config.szMmap;. 
17ea0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
17eb0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61  e = 0;.  db->nMa
17ec0 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78  xSorterMmap = 0x
17ed0 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e  7FFFFFFF;.  db->
17ee0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
17ef0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
17f00 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
17f10 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
17f20 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
17f30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
17f40 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
17f50 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
17f60 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
17f70 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
17f80 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17f90 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
17fa0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
17fb0 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53  FAULT_CKPTFULLFS
17fc0 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20  YNC.            
17fd0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b       | SQLITE_Ck
17fe0 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64  ptFullFSync.#end
17ff0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
18000 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
18010 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
18020 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
18030 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
18040 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
18050 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
18060 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
18070 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
18080 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
18090 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
180a0 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
180b0 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
180d0 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
180e0 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
180f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
18100 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
18110 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
18120 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
18130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18140 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
18150 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69  gnKeys.#endif.#i
18160 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18170 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52  _REVERSE_UNORDER
18180 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20  ED_SELECTS).    
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
181a0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
181b0 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
181c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
181d0 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
181e0 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20  L_CHECK).       
181f0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
18200 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65  TE_CellSizeCk.#e
18210 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
18220 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
18230 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20  TS3_TOKENIZER). 
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b  | SQLITE_Fts3Tok
18260 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69  enizer.#endif.#i
18270 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18280 5f 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a 20 20  _ENABLE_QPSG).  
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
182a0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
182b0 53 47 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  SG.#endif.      
182c0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
182d0 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
182e0 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
182f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18300 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
18310 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
18320 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
18330 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75  /* Add the defau
18340 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
18350 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49  uence BINARY. BI
18360 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62  NARY works for b
18370 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61  oth UTF-8.  ** a
18380 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64  nd UTF-16, so ad
18390 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  d a version for 
183a0 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e  each to avoid an
183b0 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20  y unnecessary.  
183c0 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20  ** conversions. 
183d0 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74  The only error t
183e0 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65  hat can occur he
183f0 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29  re is a malloc()
18400 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20   failure..  **. 
18410 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
18420 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53   R-52786-44878 S
18430 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68  QLite defines th
18440 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  ree built-in col
18450 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63  lating.  ** func
18460 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72  tions:.  */.  cr
18470 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
18480 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
18490 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  RY, SQLITE_UTF8,
184a0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
184b0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
184c0 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74  lation(db, sqlit
184d0 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c  e3StrBINARY, SQL
184e0 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
184f0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
18500 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
18510 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
18520 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
18530 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43  UTF16LE, 0, binC
18540 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
18550 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
18560 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
18570 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
18580 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
18590 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
185a0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
185b0 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
185c0 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
185d0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
185e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
185f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
18600 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
18610 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18620 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20  : R-08308-17224 
18630 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  The default coll
18640 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
18650 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69  or all.  ** stri
18660 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a  ngs is BINARY. .
18670 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74    */.  db->pDflt
18680 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
18690 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
186a0 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
186b0 65 33 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b  e3StrBINARY, 0);
186c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
186d0 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
186e0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66    /* Parse the f
186f0 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75  ilename/URI argu
18700 6d 65 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ment.  **.  ** O
18710 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62  nly allow sensib
18720 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  le combinations 
18730 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66  of bits in the f
18740 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20  lags argument.  
18750 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65  .  ** Throw an e
18760 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d  rror if any non-
18770 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sense combinatio
18780 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77  n is used.  If w
18790 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c  e.  ** do not bl
187a0 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62  ock illegal comb
187b0 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69  inations here, i
187c0 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a  t could trigger.
187d0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74    ** assert() st
187e0 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70  atements in deep
187f0 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73  er layers.  Sens
18800 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
18810 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a  s.  ** are:.  **
18820 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54  .  **  1:  SQLIT
18830 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a  E_OPEN_READONLY.
18840 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45    **  2:  SQLITE
18850 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
18860 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45    **  6:  SQLITE
18870 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18880 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18890 45 41 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  EATE.  */.  db->
188a0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
188b0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  s;.  assert( SQL
188c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
188d0 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20  Y  == 0x01 );.  
188e0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
188f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d  PEN_READWRITE ==
18900 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72   0x02 );.  asser
18910 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  t( SQLITE_OPEN_C
18920 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34  REATE    == 0x04
18930 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18940 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
18950 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f  0x02 ); /* READO
18960 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  NLY */.  testcas
18970 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
18980 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45  )==0x04 ); /* RE
18990 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73  ADWRITE */.  tes
189a0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
189b0 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f  s&7))==0x40 ); /
189c0 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52  * READWRITE | CR
189d0 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28  EATE */.  if( ((
189e0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20  1<<(flags&7)) & 
189f0 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0x46)==0 ){.    
18a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
18a10 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50  SE_BKPT;  /* IMP
18a20 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20  : R-65497-44594 
18a30 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
18a40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  rc = sqlite3Pars
18a50 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65  eUri(zVfs, zFile
18a60 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64  name, &flags, &d
18a70 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c  b->pVfs, &zOpen,
18a80 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a   &zErrMsg);.  }.
18a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
18ab0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
18ac0 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c  ) sqlite3OomFaul
18ad0 74 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  t(db);.    sqlit
18ae0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
18af0 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f  b, rc, zErrMsg ?
18b00 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d   "%s" : 0, zErrM
18b10 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
18b20 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
18b30 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
18b40 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  out;.  }..  /* O
18b50 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
18b60 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
18b70 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
18b80 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
18b90 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20  Vfs, zOpen, db, 
18ba0 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  &db->aDb[0].pBt,
18bb0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
18bd0 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s | SQLITE_OPEN_
18be0 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20  MAIN_DB);.  if( 
18bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18c00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18c10 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
18c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18c30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
18c40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
18c50 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
18c60 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
18c70 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _out;.  }.  sqli
18c80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 64 62  te3BtreeEnter(db
18c90 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
18ca0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
18cb0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
18cc0 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61  emaGet(db, db->a
18cd0 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
18ce0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18cf0 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20  led ) ENC(db) = 
18d00 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a  SCHEMA_ENC(db);.
18d10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18d20 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ave(db->aDb[0].p
18d30 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
18d40 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
18d50 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
18d60 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64   0);..  /* The d
18d70 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
18d80 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
18d90 20 64 61 74 61 62 61 73 65 20 69 73 20 46 55 4c   database is FUL
18da0 4c 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  L; for the temp.
18db0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
18dc0 20 69 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61   is OFF. This ma
18dd0 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
18de0 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
18df0 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
18e00 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22  [0].zDbSName = "
18e10 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
18e20 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
18e30 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18e40 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b  T_SYNCHRONOUS+1;
18e50 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  .  db->aDb[1].zD
18e60 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  bSName = "temp";
18e70 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
18e80 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47  fety_level = PAG
18e90 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
18ea0 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  FF;..  db->magic
18eb0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
18ec0 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  OPEN;.  if( db->
18ed0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
18ee0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
18ef0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
18f00 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c  egister all buil
18f10 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20  t-in functions, 
18f20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  but do not attem
18f30 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20  pt to read the. 
18f40 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68   ** database sch
18f50 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73  ema yet. This is
18f60 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
18f70 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
18f80 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
18f90 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a  is accessed..  *
18fa0 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  /.  sqlite3Error
18fb0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
18fc0 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
18fd0 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42  erPerConnectionB
18fe0 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
18ff0 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
19000 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
19010 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19020 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a  ENABLE_FTS5.  /*
19030 20 52 65 67 69 73 74 65 72 20 61 6e 79 20 62 75   Register any bu
19040 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75  ilt-in FTS5 modu
19050 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e  le before loadin
19060 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a  g the automatic.
19070 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e    ** extensions.
19080 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74   This allows aut
19090 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
190a0 73 20 74 6f 20 72 65 67 69 73 74 65 72 20 46 54  s to register FT
190b0 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a  S5 .  ** tokeniz
190c0 65 72 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72  ers and auxiliar
190d0 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f  y functions.  */
190e0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
190f0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
19100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
19120 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  5Init(db);.  }.#
19130 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64  endif..  /* Load
19140 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
19150 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
19160 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
19170 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
19180 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
19190 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
191a0 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
191b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
191c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
191d0 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
191e0 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
191f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19200 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20  rrcode(db);.    
19210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19220 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
19230 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
19240 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
19250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
19260 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
19270 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19280 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
19290 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
192a0 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
192b0 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
192c0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
192d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
192e0 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
192f0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19300 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
19310 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
19320 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
19330 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
19340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19350 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
19360 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
19370 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
19380 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63  TS3 /* automatic
19390 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20  ally defined by 
193a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
193b0 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  S4 */.  if( !db-
193c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
193d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
193e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
193f0 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
19400 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
19410 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19420 4e 41 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65  NABLE_ICU) || de
19430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19440 42 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f  BLE_ICU_COLLATIO
19450 4e 53 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  NS).  if( !db->m
19460 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
19470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19490 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
194a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
194b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
194c0 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  REE.  if( !db->m
194d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
194e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
194f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52     rc = sqlite3R
19500 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20  treeInit(db);.  
19510 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
19520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
19530 42 50 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28  BPAGE_VTAB.  if(
19540 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19550 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
19560 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
19570 71 6c 69 74 65 33 44 62 70 61 67 65 52 65 67 69  qlite3DbpageRegi
19580 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65  ster(db);.  }.#e
19590 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
195a0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41  ITE_ENABLE_DBSTA
195b0 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  T_VTAB.  if( !db
195c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
195d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
195e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
195f0 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72  e3DbstatRegister
19600 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
19610 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19620 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69  ENABLE_JSON1.  i
19630 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19640 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
19650 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
19660 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69   sqlite3Json1Ini
19670 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
19680 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
19690 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42  _ENABLE_STMTVTAB
196a0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
196b0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
196c0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
196d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74  rc = sqlite3Stmt
196e0 56 74 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20  VtabInit(db);.  
196f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d  }.#endif..  /* -
19700 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
19710 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d  LOCKING_MODE=1 m
19720 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74  akes EXCLUSIVE t
19730 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
19740 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d  ng.  ** mode.  -
19750 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
19760 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d  LOCKING_MODE=0 m
19770 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  ake NORMAL the d
19780 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
19790 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67   ** mode.  Doing
197a0 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20   nothing at all 
197b0 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41  also makes NORMA
197c0 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20  L the default.. 
197d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
197e0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
197f0 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c  G_MODE.  db->dfl
19800 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49  tLockMode = SQLI
19810 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
19820 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74  NG_MODE;.  sqlit
19830 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
19840 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
19850 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  ager(db->aDb[0].
19860 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pBt),.          
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
19890 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65  OCKING_MODE);.#e
198a0 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29  ndif..  if( rc )
198b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
198c0 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61  , rc);..  /* Ena
198d0 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  ble the lookasid
198e0 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e-malloc subsyst
198f0 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f  em */.  setupLoo
19900 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71  kaside(db, 0, sq
19910 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19920 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20  g.szLookaside,. 
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
19950 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
19960 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74  aside);..  sqlit
19970 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
19980 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45  point(db, SQLITE
19990 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54  _DEFAULT_WAL_AUT
199a0 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f  OCHECKPOINT);..o
199b0 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28  pendb_out:.  if(
199c0 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
199d0 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
199e0 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
199f0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
19a00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19a10 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
19a20 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
19a30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
19a40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
19a50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
19a60 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65  code(db);.  asse
19a70 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d  rt( db!=0 || rc=
19a80 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
19a90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19aa0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
19ab0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
19ac0 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
19ad0 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
19ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
19af0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
19b00 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
19b10 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
19b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19b30 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
19b40 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
19b50 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
19b60 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20  .    /* Opening 
19b70 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75  a db handle. Fou
19b80 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
19b90 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20   passed 0. */.  
19ba0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73    void *pArg = s
19bb0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19bc0 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20  ig.pSqllogArg;. 
19bd0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19be0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70  Config.xSqllog(p
19bf0 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61  Arg, db, zFilena
19c00 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
19c10 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
19c20 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
19c30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
19c50 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20  t char *zKey;.  
19c60 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71    if( (zKey = sq
19c70 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
19c80 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b  ter(zOpen, "hexk
19c90 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79  ey"))!=0 && zKey
19ca0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20  [0] ){.      u8 
19cb0 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  iByte;.      int
19cc0 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   i;.      char z
19cd0 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20  Decoded[40];.   
19ce0 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74     for(i=0, iByt
19cf0 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44  e=0; i<sizeof(zD
19d00 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c  ecoded)*2 && sql
19d10 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65  ite3Isxdigit(zKe
19d20 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  y[i]); i++){.   
19d30 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
19d40 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
19d50 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69  3HexToInt(zKey[i
19d60 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
19d70 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65 63 6f  (i&1)!=0 ) zDeco
19d80 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  ded[i/2] = iByte
19d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19da0 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
19db0 62 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64 2c 20  b, 0, zDecoded, 
19dc0 69 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  i/2);.    }else 
19dd0 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69  if( (zKey = sqli
19de0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
19df0 72 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22 29 29  r(zOpen, "key"))
19e00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
19e10 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
19e20 30 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65 33  0, zKey, sqlite3
19e30 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29 3b  Strlen30(zKey));
19e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19e50 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
19e60 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72  (zOpen);.  retur
19e70 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a  n rc & 0xff;.}..
19e80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
19e90 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19ea0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19eb0 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
19ec0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
19ed0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
19ee0 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
19ef0 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
19f00 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
19f30 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
19f40 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
19f50 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
19f60 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
19f70 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
19f80 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
19f90 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
19fa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
19fb0 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
19fc0 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
19fd0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
19fe0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
19ff0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
1a000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1a010 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
1a020 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
1a030 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
1a040 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
1a050 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
1a060 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
1a070 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
1a080 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a090 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1a0a0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1a0b0 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1a0c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1a0d0 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
1a0e0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
1a0f0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
1a100 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
1a110 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
1a120 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
1a130 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
1a140 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
1a150 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1a160 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
1a170 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
1a180 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a190 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
1a1a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a1b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1a1c0 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
1a1d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a1e0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
1a1f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
1a200 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
1a210 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1a220 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
1a230 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46  Filename==0 ) zF
1a240 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c  ilename = "\000\
1a250 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73  000";.  pVal = s
1a260 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
1a270 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
1a280 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
1a290 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
1a2a0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
1a2b0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1a2c0 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
1a2d0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1a2e0 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
1a2f0 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
1a300 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
1a310 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
1a320 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
1a330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a340 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a350 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1a360 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a370 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
1a380 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
1a390 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1a3a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a3b0 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
1a3c0 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
1a3d0 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
1a3e0 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45  d) ){.      SCHE
1a3f0 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20  MA_ENC(*ppDb) = 
1a400 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
1a410 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
1a420 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a440 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1a450 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
1a460 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
1a470 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
1a480 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a490 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1a4a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1a4b0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
1a4c0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
1a4d0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a4e0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
1a4f0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
1a500 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
1a510 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1a520 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1a530 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1a540 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1a550 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1a560 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1a570 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1a580 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1a590 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1a5a0 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65  ion_v2(db, zName
1a5b0 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
1a5c0 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  mpare, 0);.}../*
1a5d0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1a5e0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1a5f0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1a600 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1a610 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1a620 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1a630 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
1a640 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1a650 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1a660 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1a670 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1a680 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1a690 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1a6a0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
1a6b0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
1a6c0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
1a6d0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1a6e0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1a6f0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1a700 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1a710 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1a720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a730 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1a740 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1a750 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1a760 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1a770 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a780 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
1a790 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
1a7a0 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
1a7b0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
1a7c0 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
1a7d0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1a7e0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1a7f0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1a800 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1a810 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1a820 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1a830 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1a840 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
1a850 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
1a860 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a870 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1a880 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1a890 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
1a8a0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
1a8b0 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
1a8c0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1a8d0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1a8e0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1a8f0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1a900 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1a910 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a920 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
1a930 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20  zName8;..#ifdef 
1a940 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1a950 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1a960 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1a970 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
1a980 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1a990 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a9a0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1a9b0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a9c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1a9d0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
1a9e0 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
1a9f0 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
1aa00 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
1aa10 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
1aa20 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
1aa30 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
1aa40 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
1aa50 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
1aa60 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
1aa70 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
1aa80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1aa90 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
1aaa0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1aab0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1aac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1aad0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1aae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1aaf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1ab00 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1ab10 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1ab20 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1ab30 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1ab40 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1ab50 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1ab60 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1ab70 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1ab80 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1ab90 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1aba0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1abb0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
1abc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1abd0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
1abe0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
1abf0 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
1ac00 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
1ac10 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
1ac20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66  char*).){.#ifdef
1ac30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1ac40 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1ac50 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1ac60 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1ac70 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ac80 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1ac90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1aca0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1acb0 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1acc0 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
1acd0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1ace0 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
1acf0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
1ad00 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
1ad10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ad20 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1ad30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ad40 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1ad50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1ad60 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
1ad70 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
1ad80 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
1ad90 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
1ada0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1adb0 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
1adc0 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
1add0 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
1ade0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1adf0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
1ae00 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
1ae10 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
1ae20 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
1ae30 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
1ae40 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
1ae50 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
1ae60 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1ae70 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
1ae80 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1ae90 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1aea0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1aeb0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1aec0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1aed0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1aee0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1aef0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1af00 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1af10 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
1af20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1af30 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
1af40 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
1af50 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1af60 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1af70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1af80 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1af90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1afb0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1afc0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1afd0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1afe0 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
1aff0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
1b000 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
1b010 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
1b020 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
1b030 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
1b040 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
1b050 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
1b060 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
1b070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1b080 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
1b090 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
1b0a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1b0b0 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
1b0c0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1b0d0 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
1b0e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
1b0f0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
1b100 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
1b110 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
1b120 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
1b130 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
1b140 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
1b150 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
1b160 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
1b170 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1b180 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
1b190 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
1b1a0 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
1b1b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b1c0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1b1d0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
1b1e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b1f0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b200 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b210 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1b220 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1b230 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1b240 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1b250 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1b260 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
1b270 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1b280 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1b290 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20  are substitutes 
1b2a0 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
1b2b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
1b2c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
1b2d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1b2e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1b2f0 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
1b300 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
1b310 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
1b320 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
1b330 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
1b340 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
1b350 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1b360 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
1b370 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
1b380 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
1b390 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
1b3a0 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
1b3b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
1b3c0 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
1b3d0 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
1b3e0 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
1b3f0 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
1b400 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
1b410 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
1b420 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
1b430 74 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  t sqlite3ReportE
1b440 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69  rror(int iErr, i
1b450 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
1b460 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20   char *zType){. 
1b470 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72   sqlite3_log(iEr
1b480 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25  r, "%s at line %
1b490 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
1b4b0 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73  pe, lineno, 20+s
1b4c0 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1b4d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72  ));.  return iEr
1b4e0 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  r;.}.int sqlite3
1b4f0 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
1b500 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1b510 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1b520 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1b530 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1b540 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1b550 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1b560 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61   lineno, "databa
1b570 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b  se corruption");
1b580 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
1b590 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
1b5a0 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1b5b0 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1b5c0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1b5d0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1b5e0 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1b5f0 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e  LITE_MISUSE, lin
1b600 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a  eno, "misuse");.
1b610 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
1b620 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
1b630 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1b640 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1b650 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1b660 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1b670 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1b680 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1b690 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20  lineno, "cannot 
1b6a0 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23  open file");.}.#
1b6b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b6c0 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  UG.int sqlite3Co
1b6d0 72 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69  rruptPgnoError(i
1b6e0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20  nt lineno, Pgno 
1b6f0 70 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d  pgno){.  char zM
1b700 73 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  sg[100];.  sqlit
1b710 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1b720 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20  of(zMsg), zMsg, 
1b730 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
1b740 74 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70  tion page %d", p
1b750 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
1b760 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1b770 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1b780 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1b790 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1b7a0 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1b7b0 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e  eno, zMsg);.}.in
1b7c0 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72  t sqlite3NomemEr
1b7d0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1b7e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1b7f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b800 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1b810 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1b820 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e  rtError(SQLITE_N
1b830 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f  OMEM, lineno, "O
1b840 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  OM");.}.int sqli
1b850 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72  te3IoerrnomemErr
1b860 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1b870 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1b880 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b890 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1b8a0 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1b8b0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  tError(SQLITE_IO
1b8c0 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e  ERR_NOMEM, linen
1b8d0 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f  o, "I/O OOM erro
1b8e0 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  r");.}.#endif..#
1b8f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b900 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1b910 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1b920 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1b930 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1b940 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1b950 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1b960 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1b970 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1b980 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1b990 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1b9a0 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1b9b0 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1b9c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1b9d0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1b9e0 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1b9f0 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1ba00 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1ba10 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1ba20 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1ba30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ba40 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1ba50 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1ba60 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1ba70 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1ba80 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1ba90 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1baa0 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1bab0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1bac0 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1bad0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1bae0 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1baf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bb00 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1bb10 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1bb20 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1bb30 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1bb40 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1bb50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1bb60 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1bb70 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1bb80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1bb90 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1bba0 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1bbb0 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1bbc0 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1bbd0 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1bbe0 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1bbf0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1bc00 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1bc10 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1bc20 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1bc30 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1bc40 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1bc50 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1bc60 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1bc70 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1bc80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1bc90 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1bca0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1bcb0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1bcc0 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1bcd0 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1bce0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1bcf0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1bd00 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1bd10 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1bd20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
1bd30 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
1bd40 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
1bd50 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
1bd60 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a    int iCol = 0;.
1bd70 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
1bd80 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
1bd90 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1bda0 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
1bdb0 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
1bdc0 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
1bdd0 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
1bde0 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51  = 0;...#ifdef SQ
1bdf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1be00 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1be10 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1be20 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e  k(db) || zTableN
1be30 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1be40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1be50 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
1be60 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
1be70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1be80 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
1be90 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
1bea0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1beb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
1bec0 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
1bed0 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
1bee0 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
1bef0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
1bf00 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1bf10 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1bf20 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
1bf30 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
1bf40 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
1bf50 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1bf60 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
1bf70 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
1bf80 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
1bf90 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1bfa0 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
1bfb0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1bfc0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
1bfd0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
1bfe0 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
1bff0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
1c000 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30  ( zColumnName==0
1c010 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79   ){.    /* Query
1c020 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f   for existance o
1c030 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a  f table only */.
1c040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1c050 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
1c060 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
1c070 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
1c080 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1c090 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
1c0a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1c0b0 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
1c0c0 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1c0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c0e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c0f0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
1c100 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  l ){.      if( H
1c110 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1c120 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
1c130 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1c140 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1c150 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1c160 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e      pCol = iCol>
1c170 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c  =0 ? &pTab->aCol
1c180 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20  [iCol] : 0;.    
1c190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c1a0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
1c1b0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1c1c0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1c1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1c1e0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
1c1f0 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
1c200 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
1c210 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1c220 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
1c230 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
1c240 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
1c250 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
1c260 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
1c270 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
1c280 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1c290 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
1c2a0 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
1c2b0 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
1c2c0 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
1c2d0 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
1c2e0 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
1c2f0 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
1c300 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
1c310 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
1c320 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
1c330 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
1c340 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
1c350 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
1c360 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
1c370 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
1c380 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
1c390 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1c3a0 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
1c3b0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1c3c0 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
1c3d0 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
1c3e0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1c3f0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
1c400 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a  e(pCol,0);.    z
1c410 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e  CollSeq = pCol->
1c420 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75  zColl;.    notnu
1c430 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75  ll = pCol->notNu
1c440 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61  ll!=0;.    prima
1c450 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e  rykey  = (pCol->
1c460 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
1c470 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a  AG_PRIMKEY)!=0;.
1c480 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
1c490 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
1c4a0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
1c4b0 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
1c4c0 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
1c4d0 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
1c4e0 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
1c4f0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
1c500 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
1c510 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
1c520 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33  ollSeq = sqlite3
1c530 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a  StrBINARY;.  }..
1c540 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
1c550 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1c560 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  l(db);..  /* Whe
1c570 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
1c580 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
1c590 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
1c5a0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
1c5b0 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
1c5c0 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
1c5d0 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
1c5e0 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
1c5f0 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
1c600 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
1c610 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
1c620 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
1c630 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
1c640 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
1c650 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
1c660 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
1c670 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
1c680 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
1c690 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
1c6a0 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
1c6b0 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
1c6c0 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
1c6d0 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
1c6e0 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
1c6f0 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
1c700 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
1c710 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1c720 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
1c730 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1c740 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1c750 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
1c760 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c770 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1c780 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
1c790 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
1c7a0 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
1c7b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1c7c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1c7d0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
1c7e0 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  Msg(db, rc, (zEr
1c7f0 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
1c800 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1c810 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1c820 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
1c830 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
1c840 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1c850 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1c860 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  rc;.}../*.** Sle
1c880 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
1c890 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
1c8a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
1c8b0 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
1c8c0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
1c8d0 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
1c8e0 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
1c8f0 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
1c900 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1c910 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
1c920 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
1c930 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
1c940 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
1c950 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
1c960 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
1c970 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
1c980 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
1c990 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
1c9a0 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
1c9b0 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
1c9c0 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
1c9d0 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
1c9e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
1c9f0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
1ca00 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
1ca10 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
1ca20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1ca30 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
1ca40 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1ca50 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53  onoff){.#ifdef S
1ca60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1ca70 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1ca80 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1ca90 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1caa0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1cab0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1cac0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1cad0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1cae0 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
1caf0 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
1cb00 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
1cb10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1cb20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1cb30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cb40 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
1cb50 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
1cb60 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
1cb70 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
1cb80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
1cb90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
1cba0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1cbb0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
1cbc0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1cbd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cbe0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74  LITE_ERROR;.  Bt
1cbf0 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69  ree *pBtree;..#i
1cc00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1cc10 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1cc20 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1cc30 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1cc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1cc50 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1cc60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cc70 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1cc80 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71  );.  pBtree = sq
1cc90 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1cca0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1ccb0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1ccc0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1ccd0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
1cce0 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71  file *fd;.    sq
1ccf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1cd00 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61  pBtree);.    pPa
1cd10 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
1cd20 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
1cd30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1cd40 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64  ger!=0 );.    fd
1cd50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
1cd60 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1cd70 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
1cd80 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51  ;.    if( op==SQ
1cd90 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
1cda0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1cdb0 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1cdc0 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20  *)pArg = fd;.   
1cdd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cde0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1cdf0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1ce00 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b  L_VFS_POINTER ){
1ce10 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1ce20 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71  _vfs**)pArg = sq
1ce30 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 50  lite3PagerVfs(pP
1ce40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1ce50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ce60 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1ce70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52  QLITE_FCNTL_JOUR
1ce80 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  NAL_POINTER ){. 
1ce90 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
1cea0 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  ile**)pArg = sql
1ceb0 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c  ite3PagerJrnlFil
1cec0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1ced0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1cf00 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1cf10 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1cf20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1cf30 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1cf40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1cf50 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1cf60 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1cf70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  c;.}../*.** Inte
1cf80 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
1cf90 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
1cfa0 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
1cfb0 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
1cfc0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
1cfd0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1cfe0 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55  E_UNTESTABLE.  U
1cff0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d000 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f  op);.#else.  va_
1d010 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1d020 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
1d030 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
1d040 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
1d050 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1d060 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
1d070 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d080 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d090 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
1d0a0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
1d0b0 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
1d0c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d0d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1d0e0 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
1d0f0 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
1d100 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
1d110 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
1d120 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
1d130 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
1d140 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
1d150 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
1d160 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
1d170 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
1d180 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
1d190 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d1a0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
1d1b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d1c0 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
1d1d0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1d1e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1d1f0 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
1d200 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
1d210 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
1d220 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
1d230 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
1d240 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1d250 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
1d260 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
1d270 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
1d280 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
1d290 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
1d2a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
1d2b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d2c0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d2d0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
1d2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
1d2f0 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
1d300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d310 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1d320 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1d330 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
1d340 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
1d350 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
1d360 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
1d370 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
1d380 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
1d390 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
1d3a0 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
1d3b0 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
1d3c0 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
1d3d0 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
1d3e0 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
1d3f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1d400 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
1d410 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
1d420 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
1d430 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
1d440 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1d450 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
1d460 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1d470 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
1d480 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d490 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
1d4a0 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
1d4b0 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1d4c0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
1d4d0 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
1d4e0 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
1d4f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
1d500 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
1d510 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
1d520 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d530 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1d540 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d550 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  ol(FAULT_INSTALL
1d560 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20  , xCallback).   
1d570 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e   **.    ** Arran
1d580 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61  ge to invoke xCa
1d590 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65  llback() wheneve
1d5a0 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  r sqlite3FaultSi
1d5b0 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20  m() is called,. 
1d5c0 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61     ** if xCallba
1d5d0 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ck is not NULL..
1d5e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73      **.    ** As
1d5f0 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66   a test of the f
1d600 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d  ault simulator m
1d610 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c  echanism itself,
1d620 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1d630 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61  (0).    ** is ca
1d640 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
1d650 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e   after installin
1d660 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61  g the new callba
1d670 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ck and the retur
1d680 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66  n.    ** value f
1d690 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  rom sqlite3Fault
1d6a0 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74  Sim(0) becomes t
1d6b0 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20  he return from. 
1d6c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
1d6d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20  st_control()..  
1d6e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d6f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
1d700 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20  ULT_INSTALL: {. 
1d710 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
1d720 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
1d730 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
1d740 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
1d750 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
1d760 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
1d770 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
1d780 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
1d790 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1d7a0 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1d7b0 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29  ap, int(*)(int))
1d7c0 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
1d7d0 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45   typedef int(*TE
1d7e0 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1d7f0 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  )(int);.      sq
1d800 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d810 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1d820 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53  = va_arg(ap, TES
1d830 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1d840 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1d850 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b  ite3FaultSim(0);
1d860 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d870 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1d880 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1d890 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
1d8a0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
1d8b0 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
1d8c0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
1d8d0 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
1d8e0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
1d8f0 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
1d900 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
1d910 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
1d920 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d930 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
1d940 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
1d950 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1d960 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
1d970 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
1d980 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1d990 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
1d9a0 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1d9b0 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
1d9c0 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
1d9d0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1d9e0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1d9f0 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
1da00 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1da10 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1da20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
1da30 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
1da40 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
1da50 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
1da60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1da70 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1da80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1da90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1daa0 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
1dab0 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
1dac0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1dad0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
1dae0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1daf0 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
1db00 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
1db10 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
1db20 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
1db30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
1db40 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
1db50 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
1db60 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1db70 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
1db80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
1db90 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
1dba0 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1dbb0 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
1dbc0 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
1dbd0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
1dbe0 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
1dbf0 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
1dc00 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1dc10 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
1dc20 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
1dc30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
1dc40 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
1dc50 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
1dc60 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20   ** deleterious 
1dc70 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
1dc80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1dc90 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1dca0 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
1dcb0 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
1dcc0 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
1dcd0 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
1dce0 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
1dcf0 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
1dd00 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
1dd10 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
1dd20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
1dd30 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
1dd40 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
1dd50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1dd60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1dd70 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1dd80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1dd90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1dda0 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
1ddb0 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1ddc0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1ddd0 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1dde0 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
1ddf0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
1de00 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
1de10 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1de20 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
1de30 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
1de40 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
1de50 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1de60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1de70 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
1de80 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
1de90 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1dea0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1deb0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1dec0 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
1ded0 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
1dee0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1def0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
1df00 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
1df10 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
1df20 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
1df30 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
1df40 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1df50 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
1df60 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
1df70 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
1df80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1df90 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1dfa0 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
1dfb0 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
1dfc0 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69      assert( /*si
1dfd0 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20  de-effects-ok*/ 
1dfe0 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
1dff0 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
1e000 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
1e010 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1e020 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e030 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e040 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e050 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
1e060 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e070 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1e080 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1e090 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
1e0a0 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
1e0b0 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
1e0c0 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
1e0d0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
1e0e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1e0f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1e100 73 20 41 4c 57 41 59 53 28 58 29 20 69 66 20 58  s ALWAYS(X) if X
1e110 20 69 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69   is true, or 0 i
1e120 66 20 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  f X is false..  
1e130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e140 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74  recommended test
1e150 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68   is X==2.  If th
1e160 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1e170 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  s 2, that means.
1e180 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20      ** ALWAYS() 
1e190 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1e1a0 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d  both no-op pass-
1e1b0 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20  through macros, 
1e1c0 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20  which is the.   
1e1d0 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74   ** default sett
1e1e0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74  ing.  If the ret
1e1f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20  urn value is 1, 
1e200 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73  then ALWAYS() is
1e210 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68   either.    ** h
1e220 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1e230 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73  e or else it ass
1e240 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75  erts if its argu
1e250 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20  ment is false.. 
1e260 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
1e270 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63  behavior (hard-c
1e280 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73  oded to true) is
1e290 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1e2a0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1e2b0 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1e2c0 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1e2d0 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74  s disabled and t
1e2e0 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
1e2f0 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72   behavior (asser
1e300 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
1e310 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73  t to ALWAYS() is
1e320 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63   false) is the c
1e330 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
1e340 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1e350 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
1e360 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1e370 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
1e380 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20  ** The run-time 
1e390 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d  test procedure m
1e3a0 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ight look someth
1e3b0 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ing like this:. 
1e3c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1e3d0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1e3e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1e3f0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1e400 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a   2)==2 ){.    **
1e410 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1e420 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1e430 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  e no-op pass-thr
1e440 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20  ough macros.    
1e450 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  **    }else if( 
1e460 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e470 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e480 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20  CTRL_ASSERT, 1) 
1e490 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1e4a0 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65  / ALWAYS(x) asse
1e4b0 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72  rts that x is tr
1e4c0 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73  ue. NEVER(x) ass
1e4d0 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e  erts x is false.
1e4e0 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1e4f0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1e500 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20   ALWAYS(x) is a 
1e510 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56  constant 1.  NEV
1e520 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  ER(x) is a const
1e530 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20  ant 0..    **   
1e540 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61   }.    */.    ca
1e550 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e560 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20  RL_ALWAYS: {.   
1e570 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1e580 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1e590 20 72 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53   rc = x ? ALWAYS
1e5a0 28 78 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  (x) : 0;.      b
1e5b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1e5c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
1e5d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e5e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e5f0 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
1e600 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e610 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
1e620 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
1e630 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
1e640 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
1e650 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
1e660 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
1e670 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
1e680 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1e690 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1e6a0 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1e6b0 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
1e6c0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1e6d0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1e6e0 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
1e6f0 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
1e700 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1e710 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1e720 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
1e730 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1e740 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1e750 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1e760 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
1e770 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1e780 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
1e790 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
1e7a0 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
1e7b0 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
1e7c0 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
1e7d0 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
1e7e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1e7f0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1e800 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e810 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1e820 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
1e830 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1e840 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
1e850 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
1e860 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1e870 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
1e880 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
1e890 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1e8a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e8b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1e8c0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1e8d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1e8e0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1e8f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1e900 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1e910 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1e920 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1e930 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1e940 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1e950 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1e960 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1e970 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1e980 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e990 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1e9a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e9b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e9c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e9d0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1e9e0 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1e9f0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1ea00 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1ea10 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1ea20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1ea30 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1ea40 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1ea50 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1ea60 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1ea70 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1ea80 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1ea90 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1eaa0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1eab0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1eac0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1ead0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1eae0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1eaf0 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1eb00 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1eb10 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1eb20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1eb30 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1eb40 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1eb50 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1eb60 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1eb70 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1eb80 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1eb90 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1eba0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ebb0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1ebc0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1ebd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ebe0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1ebf0 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1ec00 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1ec10 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1ec20 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1ec30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ec40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ec50 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
1ec60 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ec70 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ec80 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
1ec90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1eca0 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
1ecb0 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
1ecc0 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
1ecd0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1ece0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
1ecf0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
1ed00 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
1ed10 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
1ed20 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
1ed30 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
1ed40 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
1ed50 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
1ed60 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1ed70 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
1ed80 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
1ed90 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
1eda0 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
1edb0 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
1edc0 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
1edd0 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
1ede0 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
1edf0 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1ee00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ee10 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1ee20 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
1ee30 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
1ee40 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1ee50 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
1ee60 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
1ee70 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
1ee80 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
1ee90 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
1eea0 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
1eeb0 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
1eec0 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
1eed0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1eee0 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 20  endif ..    /*  
1eef0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ef00 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ef10 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1ef20 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
1ef30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1ef40 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
1ef50 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
1ef60 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
1ef70 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
1ef80 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
1ef90 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
1efa0 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
1efb0 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
1efc0 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
1efd0 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
1efe0 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1eff0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f000 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1f010 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
1f020 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1f030 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
1f040 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
1f050 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1f060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f070 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1f080 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1f090 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1f0a0 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b  R_CORRUPT, int);
1f0b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1f0c0 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c  et or clear a fl
1f0d0 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
1f0e0 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1f0f0 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61  ase file is alwa
1f100 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20  ys well-.    ** 
1f110 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72  formed and never
1f120 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20   corrupt.  This 
1f130 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79  flag is clear by
1f140 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61   default, indica
1f150 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ting that.    **
1f160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f170 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74  might have arbit
1f180 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e  rary corruption.
1f190 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c    Setting the fl
1f1a0 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ag during.    **
1f1b0 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20   testing causes 
1f1c0 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29  certain assert()
1f1d0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1f1e0 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63  he code to be ac
1f1f0 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74  tivated.    ** t
1f200 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69  hat demonstrat i
1f210 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c  nvariants on wel
1f220 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
1f230 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1f240 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f250 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1f260 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20  ORRUPT: {.      
1f270 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f280 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74  fig.neverCorrupt
1f290 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1f2a0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1f2b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1f2c0 65 74 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64  et the threshold
1f2d0 20 61 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63   at which OP_Onc
1f2e0 65 20 63 6f 75 6e 74 65 72 73 20 72 65 73 65 74  e counters reset
1f2f0 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20   back to zero.. 
1f300 20 20 20 2a 2a 20 42 79 20 64 65 66 61 75 6c 74     ** By default
1f310 20 74 68 69 73 20 69 73 20 30 78 37 66 66 66 66   this is 0x7ffff
1f320 66 66 65 20 28 6f 76 65 72 20 32 20 62 69 6c 6c  ffe (over 2 bill
1f330 69 6f 6e 29 2c 20 62 75 74 20 74 68 61 74 20 76  ion), but that v
1f340 61 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a 20 74  alue is.    ** t
1f350 6f 6f 20 62 69 67 20 74 6f 20 74 65 73 74 20 69  oo big to test i
1f360 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61  n a reasonable a
1f370 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73  mount of time, s
1f380 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69  o this control i
1f390 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69 64 65  s.    ** provide
1f3a0 64 20 74 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c  d to set a small
1f3b0 20 61 6e 64 20 65 61 73 69 6c 79 20 72 65 61 63   and easily reac
1f3c0 68 61 62 6c 65 20 72 65 73 65 74 20 76 61 6c 75  hable reset valu
1f3d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
1f3e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f3f0 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48  RL_ONCE_RESET_TH
1f400 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20  RESHOLD: {.     
1f410 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1f420 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73 65 74 54  nfig.iOnceResetT
1f430 68 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72  hreshold = va_ar
1f440 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1f450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1f460 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1f470 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1f480 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1f490 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61  BE_COVERAGE, xCa
1f4a0 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20  llback, ptr);.  
1f4b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1f4c0 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67  the VDBE coverag
1f4d0 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
1f4e0 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  ion to xCallback
1f4f0 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20   with context . 
1f500 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74     ** pointer pt
1f510 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1f520 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f530 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1f540 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
1f550 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1f560 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1f570 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c  id (*branch_call
1f580 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
1f590 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71  u8,u8);.      sq
1f5a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f5b0 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20  g.xVdbeBranch = 
1f5c0 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68  va_arg(ap,branch
1f5d0 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  _callback);.    
1f5e0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1f5f0 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63  onfig.pVdbeBranc
1f600 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  hArg = va_arg(ap
1f610 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1f620 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f630 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1f640 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f650 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f660 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
1f670 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20  b, nMax); */.   
1f680 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f690 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
1f6a0 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
1f6b0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1f6c0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1f6d0 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72       db->nMaxSor
1f6e0 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67  terMmap = va_arg
1f6f0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1f700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f710 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1f720 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f730 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1f740 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  NIT);.    **.   
1f750 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
1f760 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68  E_OK if SQLite h
1f770 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
1f780 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45  zed and SQLITE_E
1f790 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e  RROR if.    ** n
1f7a0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ot..    */.    c
1f7b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f7c0 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20  TRL_ISINIT: {.  
1f7d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1f7e0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1f7f0 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  it==0 ) rc = SQL
1f800 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1f810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f820 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1f830 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1f840 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1f850 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65  STER, db, dbName
1f860 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
1f870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f880 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
1f890 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
1f8a0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
1f8b0 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f  s.  "db" is a po
1f8c0 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
1f8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1f8e0 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65  nection.  dbName
1f8f0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1f900 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e   name (ex: "main
1f910 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d  " or.    ** "tem
1f920 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72  p") which will r
1f930 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73  eceive the impos
1f940 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75  ter.  "onOff" tu
1f950 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  rns imposter mod
1f960 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f  e on.    ** or o
1f970 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74  ff.  "tnum" is t
1f980 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1f990 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68  the b-tree to wh
1f9a0 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ich the imposter
1f9b0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  .    ** table sh
1f9c0 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  ould connect..  
1f9d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
1f9e0 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  le imposter mode
1f9f0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
1fa00 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64  chema has alread
1fa10 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20  y been parsed.  
1fa20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20  Then.    ** run 
1fa30 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20  a single CREATE 
1fa40 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
1fa50 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
1fa60 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
1fa70 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  in.    ** the pa
1fa80 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68  rsed schema.  Th
1fa90 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72  en turn imposter
1faa0 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61   mode back off a
1fab0 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  gain..    **.   
1fac0 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20   ** If onOff==0 
1fad0 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20  and tnum>0 then 
1fae0 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  reset the schema
1faf0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1fb00 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20  es, causing.    
1fb10 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
1fb20 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65   be reparsed the
1fb30 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1fb40 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68   needed.  This h
1fb50 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66  as the.    ** ef
1fb60 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20  fect of erasing 
1fb70 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62  all imposter tab
1fb80 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1fb90 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1fba0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
1fbb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1fbc0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1fbd0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1fbe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fbf0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1fc00 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1fc10 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
1fc20 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61  dDbName(db, va_a
1fc30 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72  rg(ap,const char
1fc40 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  *));.      db->i
1fc50 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69  nit.busy = db->i
1fc60 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
1fc70 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  e = va_arg(ap,in
1fc80 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  t);.      db->in
1fc90 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f  it.newTnum = va_
1fca0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1fcb0 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
1fcc0 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69  busy==0 && db->i
1fcd0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b  nit.newTnum>0 ){
1fce0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fcf0 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
1fd00 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
1fd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1fd20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1fd30 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1fd40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fd50 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 59  }..#if defined(Y
1fd60 59 43 4f 56 45 52 41 47 45 29 0a 20 20 20 20 2f  YCOVERAGE).    /
1fd70 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1fd80 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1fd90 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43  ESTCTRL_PARSER_C
1fda0 4f 56 45 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f  OVERAGE, FILE *o
1fdb0 75 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut).    **.    *
1fdc0 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74  * This test cont
1fdd0 72 6f 6c 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61  rol (only availa
1fde0 62 6c 65 20 77 68 65 6e 20 53 51 4c 69 74 65 20  ble when SQLite 
1fdf0 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
1fe00 0a 20 20 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45  .    ** -DYYCOVE
1fe10 52 41 47 45 29 20 77 72 69 74 65 73 20 61 20 72  RAGE) writes a r
1fe20 65 70 6f 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22  eport onto "out"
1fe30 20 74 68 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a   that shows all.
1fe40 20 20 20 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f      ** state/loo
1fe50 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69  kahead combinati
1fe60 6f 6e 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ons in the parse
1fe70 72 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a  r state machine.
1fe80 20 20 20 20 2a 2a 20 77 68 69 63 68 20 61 72 65      ** which are
1fe90 20 6e 65 76 65 72 20 65 78 65 72 63 69 73 65 64   never exercised
1fea0 2e 20 20 49 66 20 61 6e 79 20 73 74 61 74 65 20  .  If any state 
1feb0 69 73 20 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20  is missed, make 
1fec0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
1fed0 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 45 52  n code SQLITE_ER
1fee0 52 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ROR..    */.    
1fef0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1ff00 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45  CTRL_PARSER_COVE
1ff10 52 41 47 45 3a 20 7b 0a 20 20 20 20 20 20 46 49  RAGE: {.      FI
1ff20 4c 45 20 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67  LE *out = va_arg
1ff30 28 61 70 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20  (ap, FILE*);.   
1ff40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
1ff50 72 73 65 72 43 6f 76 65 72 61 67 65 28 6f 75 74  rserCoverage(out
1ff60 29 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ) ) rc = SQLITE_
1ff70 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1ff80 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1ff90 20 2f 2a 20 64 65 66 69 6e 65 64 28 59 59 43 4f   /* defined(YYCO
1ffa0 56 45 52 41 47 45 29 20 2a 2f 0a 20 20 7d 0a 20  VERAGE) */.  }. 
1ffb0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
1ffc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e  dif /* SQLITE_UN
1ffd0 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65  TESTABLE */.  re
1ffe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fff0 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
20000 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
20010 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
20020 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
20030 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
20040 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
20050 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
20060 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
20070 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
20080 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
20090 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
200a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
200b0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
200c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
200d0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
200e0 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
200f0 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
20100 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
20110 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
20120 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
20130 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
20140 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
20150 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
20160 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
20170 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
20180 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
20190 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
201a0 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
201b0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
201c0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
201d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
201e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
201f0 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
20200 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
20210 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
20220 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
20230 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
20240 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
20250 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20  *zParam){.  if( 
20260 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
20270 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75  zParam==0 ) retu
20280 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
20290 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
202a0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
202b0 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
202c0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
202d0 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
202e0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
202f0 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
20300 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
20310 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
20320 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
20330 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
20340 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
20350 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
20360 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
20370 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
20380 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20390 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
203a0 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
203b0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
203c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
203d0 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
203e0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
203f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
20400 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
20410 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20420 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
20430 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
20440 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
20450 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
20460 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
20470 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
20480 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
20490 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
204a0 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
204b0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
204c0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
204d0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
204e0 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
204f0 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
20500 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
20510 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
20520 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
20530 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20540 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
20550 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
20560 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
20570 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
20580 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
20590 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
205a0 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
205b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
205c0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
205d0 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
205e0 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
205f0 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
20600 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44  f( z && sqlite3D
20610 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
20620 26 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44  &v)==0 ){.    bD
20630 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
20640 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
20650 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20660 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
20670 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
20680 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
20690 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
206a0 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
206b0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
206c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
206d0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
206e0 29 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a  ){.  int iDb = z
206f0 44 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33  DbName ? sqlite3
20700 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
20710 44 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72  DbName) : 0;.  r
20720 65 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20  eturn iDb<0 ? 0 
20730 3a 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  : db->aDb[iDb].p
20740 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  Bt;.}../*.** Ret
20750 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  urn the filename
20760 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20780 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
20790 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f  onnection..*/.co
207a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
207b0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71  3_db_filename(sq
207c0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
207d0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
207e0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
207f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20800 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
20810 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
20820 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
20830 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
20840 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
20850 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
20860 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
20870 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
20880 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
20890 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
208a0 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ? sqlite3BtreeGe
208b0 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a  tFilename(pBt) :
208c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
208d0 75 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73  urn 1 if databas
208e0 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f  e is read-only o
208f0 72 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74  r 0 if read/writ
20900 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
20910 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61  .** no such data
20920 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  base exists..*/.
20930 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
20940 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20  eadonly(sqlite3 
20950 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
20960 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
20970 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
20980 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
20990 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
209a0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
209b0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
209c0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
209d0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
209e0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
209f0 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
20a00 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
20a10 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
20a20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
20a30 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
20a40 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d  nly(pBt) : -1;.}
20a50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20a60 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
20a70 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73  /*.** Obtain a s
20a80 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66  napshot handle f
20a90 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  or the snapshot 
20aa0 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20  of database zDb 
20ab0 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65  currently .** be
20ac0 69 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64  ing read by hand
20ad0 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
20ae0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
20af0 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  et(.  sqlite3 *d
20b00 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
20b10 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33   *zDb,.  sqlite3
20b20 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e  _snapshot **ppSn
20b30 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20  apshot.){.  int 
20b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
20b50 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  R;.#ifndef SQLIT
20b60 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64  E_OMIT_WAL..#ifd
20b70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
20b80 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
20b90 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
20ba0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
20bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20bc0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
20bd0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
20be0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
20bf0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28  ->mutex);..  if(
20c00 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
20c10 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
20c20 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
20c30 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
20c40 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
20c50 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
20c60 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
20c70 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
20c80 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
20c90 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
20ca0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
20cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20cc0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
20cd0 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Bt, 0);.        
20ce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20cf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
20d00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d10 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69  SnapshotGet(sqli
20d20 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
20d30 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b  t), ppSnapshot);
20d40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20d50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
20d60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20d70 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
20d80 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
20d90 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
20da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20db0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
20dc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
20dd0 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65  the snapshot ide
20de0 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70  ndified by pSnap
20df0 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  shot..*/.int sql
20e00 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
20e10 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en(.  sqlite3 *d
20e20 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
20e30 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65   *zDb, .  sqlite
20e40 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
20e50 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
20e60 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20e70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20e80 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
20e90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20ea0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
20eb0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
20ec0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
20ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
20ee0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
20ef0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
20f00 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20f10 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
20f20 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
20f30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   ){.    int iDb;
20f40 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
20f50 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
20f60 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69   zDb);.    if( i
20f70 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
20f80 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
20f90 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Bt = db->aDb[iDb
20fa0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
20fb0 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   0==sqlite3Btree
20fc0 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42  IsInReadTrans(pB
20fd0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
20fe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
20ff0 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69  napshotOpen(sqli
21000 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
21010 74 29 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a  t), pSnapshot);.
21020 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21040 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21050 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
21060 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ns(pBt, 0);.    
21070 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21080 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73  erSnapshotOpen(s
21090 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
210a0 28 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20  (pBt), 0);.     
210b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
210c0 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
210d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
210e0 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
210f0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
21100 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
21110 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
21120 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73  ecover as many s
21130 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73  napshots as poss
21140 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61  ible from the wa
21150 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  l file associate
21160 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61  d with.** schema
21170 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73 65   zDb of database
21180 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
21190 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63  te3_snapshot_rec
211a0 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  over(sqlite3 *db
211b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
211c0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
211d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
211e0 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20  nt iDb;.#ifndef 
211f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
21200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21210 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
21220 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
21230 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
21240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21250 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21260 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
21280 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
21290 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
212a0 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
212b0 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30  b);.  if( iDb==0
212c0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
212d0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
212e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
212f0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
21300 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
21310 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
21320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21330 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
21340 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 0);.      if
21350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21360 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21370 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
21380 73 68 6f 74 52 65 63 6f 76 65 72 28 73 71 6c 69  shotRecover(sqli
21390 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
213a0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  t));.        sql
213b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
213c0 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
213d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
213e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
213f0 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
21400 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
21410 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
21420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
21430 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68  ree a snapshot h
21440 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66  andle obtained f
21450 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  rom sqlite3_snap
21460 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76  shot_get()..*/.v
21470 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  oid sqlite3_snap
21480 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65  shot_free(sqlite
21490 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
214a0 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  pshot){.  sqlite
214b0 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74  3_free(pSnapshot
214c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
214d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
214e0 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  PSHOT */..#ifnde
214f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
21500 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
21510 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  S./*.** Given th
21520 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6d 70  e name of a comp
21530 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2c  ile-time option,
21540 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
21550 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77  that option.** w
21560 61 73 20 75 73 65 64 20 61 6e 64 20 66 61 6c 73  as used and fals
21570 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
21580 54 68 65 20 6e 61 6d 65 20 63 61 6e 20 6f 70 74  The name can opt
21590 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69  ionally begin wi
215a0 74 68 20 22 53 51 4c 49 54 45 5f 22 20 62 75 74  th "SQLITE_" but
215b0 20 74 68 65 20 22 53 51 4c 49 54 45 5f 22 20 70   the "SQLITE_" p
215c0 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e 6f 74 20  refix.** is not 
215d0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 6d  required for a m
215e0 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  atch..*/.int sql
215f0 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
21600 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20 63 68  on_used(const ch
21610 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20  ar *zOptName){. 
21620 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74   int i, n;.  int
21630 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63   nOpt;.  const c
21640 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f  har **azCompileO
21650 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c 49 54 45  pt;. .#if SQLITE
21660 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
21670 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e 61 6d 65  R.  if( zOptName
21680 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ==0 ){.    (void
21690 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
216a0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
216b0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
216c0 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20   azCompileOpt = 
216d0 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70  sqlite3CompileOp
216e0 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 0a 20  tions(&nOpt);.. 
216f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
21700 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 22  ICmp(zOptName, "
21710 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d 30 20  SQLITE_", 7)==0 
21720 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20 37 3b  ) zOptName += 7;
21730 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  .  n = sqlite3St
21740 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61 6d 65 29  rlen30(zOptName)
21750 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 6e 4f  ;..  /* Since nO
21760 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 69  pt is normally i
21770 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74 73 2c  n single digits,
21780 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72 63 68   a linear search
21790 20 69 73 20 0a 20 20 2a 2a 20 61 64 65 71 75 61   is .  ** adequa
217a0 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  te. No need for 
217b0 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e  a binary search.
217c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
217d0 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOpt; i++){.   
217e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
217f0 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 61  ICmp(zOptName, a
21800 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 2c 20  zCompileOpt[i], 
21810 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71  n)==0.     && sq
21820 6c 69 74 65 33 49 73 49 64 43 68 61 72 28 28 75  lite3IsIdChar((u
21830 6e 73 69 67 6e 65 64 20 63 68 61 72 29 61 7a 43  nsigned char)azC
21840 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29  ompileOpt[i][n])
21850 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
21860 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21890 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d 70 69 6c   the N-th compil
218a0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 73 74  e-time option st
218b0 72 69 6e 67 2e 20 20 49 66 20 4e 20 69 73 20 6f  ring.  If N is o
218c0 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a 2a 2a 20  ut of range,.** 
218d0 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70 6f  return a NULL po
218e0 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
218f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 6f  char *sqlite3_co
21900 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
21910 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f  int N){.  int nO
21920 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pt;.  const char
21930 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b   **azCompileOpt;
21940 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20  .  azCompileOpt 
21950 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65  = sqlite3Compile
21960 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a  Options(&nOpt);.
21970 20 20 69 66 28 20 4e 3e 3d 30 20 26 26 20 4e 3c    if( N>=0 && N<
21980 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOpt ){.    retu
21990 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b  rn azCompileOpt[
219a0 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N];.  }.  return
219b0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
219c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
219d0 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
219e0 2a 2f 0a                                         */.