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

Artifact a511e378ab8e839f77e041347fe045194b9f4b2203050c6dbfdb75902ff628c2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 28 73 71 6c 69 74 65 33 5f 69  c( sz*(sqlite3_i
63e0: 6e 74 36 34 29 63 6e 74 20 29 3b 20 20 2f 2a 20  nt64)cnt );  /* 
63f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6400: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6410: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6420: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6430: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6440: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6450: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6460: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6470: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6480: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6490: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
64a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
64b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
64c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
64d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
64f0: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
6500: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
6510: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
6520: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
6530: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
6540: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
6550: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6560: 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20 20  .nSlot = cnt;.  
6570: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
6580: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
6590: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
65a0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
65b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
65c0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 3b  lookaside.pInit;
65d0: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
65e0: 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b 0a  side.pInit = p;.
65f0: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
6600: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
6610: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
6620: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6630: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
6640: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
6650: 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  sable = 0;.    d
6660: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6670: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
6680: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
6690: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66a0: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
66b0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
66c0: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
66d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
66e0: 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  isable = 1;.    
66f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6700: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 20  alloced = 0;.   
6710: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
6720: 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Slot = 0;.  }.#e
6730: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6740: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f  MIT_LOOKASIDE */
6750: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6760: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6770: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
6780: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6790: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
67a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
67b0: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
67c0: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
67d0: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
67e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
67f0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6800: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6810: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6820: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6830: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6840: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
6850: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
6860: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
6870: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
6880: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
6890: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
68a0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
68b0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
68c0: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
68d0: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
68e0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
68f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6900: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6910: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6920: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6940: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
6950: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6960: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6980: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
69a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
69b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
69c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
69d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
69e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
69f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6a00: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6a10: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6a20: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6a30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6a40: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
6a50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6a60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6a80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6a90: 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  Flush any dirty 
6aa0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
6ab0: 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79  er-cache for any
6ac0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6ad0: 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  se.** to disk..*
6ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6af0: 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69  _cacheflush(sqli
6b00: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6b10: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
6b20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62  LITE_OK;.  int b
6b30: 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23  SeenBusy = 0;..#
6b40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b50: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6b60: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6b70: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6b90: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6ba0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6bb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6bc0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6bd0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6be0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6bf0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6c00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6c10: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6c20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6c30: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6c40: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6c50: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6c60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6c70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6c80: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
6c90: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6ca0: 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20  Flush(pPager);. 
6cb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6cc0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
6cd0: 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20      bSeenBusy = 
6ce0: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
6cf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6d10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6d20: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6d30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6d40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6d50: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
6d60: 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79  _OK && bSeenBusy
6d70: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
6d80: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
6d90: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6da0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6db0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6dc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6dd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6de0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6df0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6e00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6e10: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6e20: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6e30: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6e40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6e50: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
6e60: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50  : {.      /* IMP
6e70: 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31 20  : R-06824-28531 
6e80: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  */.      /* IMP:
6e90: 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20 2a   R-36257-52125 *
6ea0: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  /.      db->aDb[
6eb0: 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76 61  0].zDbSName = va
6ec0: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  E_OK;.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6f00: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6f10: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
6f20: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
6f30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
6f40: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
6f50: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
6f60: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
6f70: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6f80: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
6f90: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
6fa0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
6fb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6fc0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
6fd0: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
6fe0: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
6ff0: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
7000: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
7010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7020: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7030: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
7040: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
7050: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
7060: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
7070: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
7080: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
7090: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
70a0: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
70b0: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
70c0: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
70d0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
70e0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
70f0: 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EY,           SQ
7100: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
7110: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7120: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7130: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
7140: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
7150: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
7160: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7170: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7180: 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52  E_FTS3_TOKENIZER
7190: 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b  , SQLITE_Fts3Tok
71a0: 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20 20  enizer  },.     
71b0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
71c0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  NFIG_ENABLE_LOAD
71d0: 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c 49  _EXTENSION, SQLI
71e0: 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
71f0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
7200: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
7210: 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 2c  O_CKPT_ON_CLOSE,
7220: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f 43        SQLITE_NoC
7230: 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a 20  kptOnClose  },. 
7240: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7250: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
7260: 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20 20  QPSG,           
7270: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
7280: 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  G     },.       
7290: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
72a0: 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
72b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
72c0: 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20 20  _TriggerEQP     
72d0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
72e0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53  ITE_DBCONFIG_RES
72f0: 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20 20  ET_DATABASE,    
7300: 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65 74      SQLITE_Reset
7310: 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20 20  Database  },.   
7320: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7330: 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
7340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
7350: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 20  LITE_Defensive  
7360: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7370: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7380: 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
7390: 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57  ,       SQLITE_W
73a0: 72 69 74 65 53 63 68 65 6d 61 7c 0a 20 20 20 20  riteSchema|.    
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
73e0: 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f  ITE_NoSchemaErro
73f0: 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  r  },.        { 
7400: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7410: 4c 45 47 41 43 59 5f 41 4c 54 45 52 5f 54 41 42  LEGACY_ALTER_TAB
7420: 4c 45 2c 20 20 20 20 53 51 4c 49 54 45 5f 4c 65  LE,    SQLITE_Le
7430: 67 61 63 79 41 6c 74 65 72 20 20 20 20 7d 2c 0a  gacyAlter    },.
7440: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7450: 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 44 51 53  _DBCONFIG_NO_DQS
7460: 5f 53 43 48 45 4d 41 2c 20 20 20 20 20 20 20 20  _SCHEMA,        
7470: 20 53 51 4c 49 54 45 5f 4e 6f 44 51 53 53 63 68   SQLITE_NoDQSSch
7480: 65 6d 61 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ema    },.      
7490: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
74a0: 46 49 47 5f 4e 4f 5f 44 51 53 2c 20 20 20 20 20  FIG_NO_DQS,     
74b0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
74c0: 45 5f 4e 6f 44 51 53 20 20 20 20 20 20 20 20 20  E_NoDQS         
74d0: 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   },.      };.   
74e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
74f0: 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  i;.      rc = SQ
7500: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49  LITE_ERROR; /* I
7510: 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37  MP: R-42790-2337
7520: 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  2 */.      for(i
7530: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
7540: 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a  aFlagOp); i++){.
7550: 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61          if( aFla
7560: 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b  gOp[i].op==op ){
7570: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
7580: 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70  noff = va_arg(ap
7590: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
75a0: 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61    int *pRes = va
75b0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
75c0: 20 20 20 20 20 20 20 20 20 20 75 36 34 20 6f 6c            u64 ol
75d0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
75e0: 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  gs;.          if
75f0: 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20  ( onoff>0 ){.   
7600: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
7610: 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d  gs |= aFlagOp[i]
7620: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7630: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66   }else if( onoff
7640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7650: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
7660: 7e 28 75 36 34 29 61 46 6c 61 67 4f 70 5b 69 5d  ~(u64)aFlagOp[i]
7670: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
7680: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7690: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
76a0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
76b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
76c0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
76d0: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
76e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
76f0: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
7700: 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
7710: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61  = (db->flags & a
7720: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21  FlagOp[i].mask)!
7730: 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  =0;.          }.
7740: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
7750: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
7760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7770: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7790: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
77a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
77c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
77d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
77e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
77f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
7800: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73   available..*/.s
7810: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c  tatic int binCol
7820: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
7830: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
7840: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7850: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7860: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7870: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
7880: 72 63 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f  rc, n;.  UNUSED_
7890: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
78a0: 64 29 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c  d);.  n = nKey1<
78b0: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
78c0: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
78d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
78e0: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
78f0: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
7900: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
7910: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
7920: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
7930: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
7940: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
7950: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
7960: 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rary. */.  asser
7970: 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79  t( pKey1 && pKey
7980: 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  2 );.  rc = memc
7990: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
79a0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
79b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
79c0: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
79d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
79e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
79f0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
7a00: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 52 54 52 49  tion named "RTRI
7a10: 4d 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  M" which is alwa
7a20: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
7a30: 20 20 49 67 6e 6f 72 65 20 74 72 61 69 6c 69 6e    Ignore trailin
7a40: 67 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  g spaces..*/.sta
7a50: 74 69 63 20 69 6e 74 20 72 74 72 69 6d 43 6f 6c  tic int rtrimCol
7a60: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  lFunc(.  void *p
7a70: 55 73 65 72 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  User,.  int nKey
7a80: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7a90: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7aa0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7ab0: 4b 65 79 32 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  Key2.){.  const 
7ac0: 75 38 20 2a 70 4b 31 20 3d 20 28 63 6f 6e 73 74  u8 *pK1 = (const
7ad0: 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f   u8*)pKey1;.  co
7ae0: 6e 73 74 20 75 38 20 2a 70 4b 32 20 3d 20 28 63  nst u8 *pK2 = (c
7af0: 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 32 3b 0a  onst u8*)pKey2;.
7b00: 20 20 77 68 69 6c 65 28 20 6e 4b 65 79 31 20 26    while( nKey1 &
7b10: 26 20 70 4b 31 5b 6e 4b 65 79 31 2d 31 5d 3d 3d  & pK1[nKey1-1]==
7b20: 27 20 27 20 29 20 6e 4b 65 79 31 2d 2d 3b 0a 20  ' ' ) nKey1--;. 
7b30: 20 77 68 69 6c 65 28 20 6e 4b 65 79 32 20 26 26   while( nKey2 &&
7b40: 20 70 4b 32 5b 6e 4b 65 79 32 2d 31 5d 3d 3d 27   pK2[nKey2-1]=='
7b50: 20 27 20 29 20 6e 4b 65 79 32 2d 2d 3b 0a 20 20   ' ) nKey2--;.  
7b60: 72 65 74 75 72 6e 20 62 69 6e 43 6f 6c 6c 46 75  return binCollFu
7b70: 6e 63 28 70 55 73 65 72 2c 20 6e 4b 65 79 31 2c  nc(pUser, nKey1,
7b80: 20 70 4b 65 79 31 2c 20 6e 4b 65 79 32 2c 20 70   pKey1, nKey2, p
7b90: 4b 65 79 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Key2);.}../*.** 
7ba0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
7bb0: 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65  ollSeq is the de
7bc0: 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42  fault built-in B
7bd0: 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71  INARY..*/.int sq
7be0: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f  lite3IsBinary(co
7bf0: 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b  nst CollSeq *p){
7c00: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7c10: 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43  || p->xCmp!=binC
7c20: 6f 6c 6c 46 75 6e 63 20 7c 7c 20 73 74 72 63 6d  ollFunc || strcm
7c30: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e 41  p(p->zName,"BINA
7c40: 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  RY")==0 );.  ret
7c50: 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78  urn p==0 || p->x
7c60: 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63  Cmp==binCollFunc
7c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7c80: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7c90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7ca0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7cb0: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7cc0: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7cd0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7ce0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7cf0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7d00: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7d10: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7d20: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7d30: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7d40: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7d50: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7d60: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7d70: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7d80: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7d90: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7da0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7db0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7dc0: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7dd0: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7de0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7df0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7e00: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7e10: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7e20: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7e30: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7e40: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7e50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7e60: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7e70: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7e80: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7e90: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7ea0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7eb0: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7ec0: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7ed0: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7ee0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7ef0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7f00: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7f10: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7f20: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7f30: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7f40: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7f60: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7f70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7f80: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7f90: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7fa0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7fb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7fc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7fd0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
7ff0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
8000: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
8010: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
8020: 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  id() API functio
8030: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8040: 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65  e3_set_last_inse
8050: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
8060: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *db, sqlite3_in
8070: 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66  t64 iRowid){.#if
8080: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8090: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
80a0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
80b0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
80c0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
80d0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
80e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
80f0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
8100: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8110: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74  tex);.  db->last
8120: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
8130: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8140: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8160: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8170: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
8180: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
8190: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
81a0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
81b0: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
81c0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
81d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
81e0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
81f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8200: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
8210: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
8220: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8230: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8240: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
8250: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
8260: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8270: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
8280: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
8290: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
82a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
82b0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
82c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
82d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
82e0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
82f0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
8300: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
8310: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
8320: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8330: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8340: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8350: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
8360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8370: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
8380: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
8390: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
83a0: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
83b0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
83c0: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
83d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
83e0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
83f0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
8400: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
8410: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
8420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
8430: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
8440: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
8450: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
8460: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
8470: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
8480: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
8490: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
84a0: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
84b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
84c0: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
84d0: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
84e0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
84f0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
8500: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
8510: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
8520: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8530: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
8540: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
8550: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
8560: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
8570: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
8580: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
8590: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
85a0: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
85b0: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
85c0: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
85d0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
85e0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
85f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
8600: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
8610: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
8620: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
8630: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
8640: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
8650: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
8660: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
8670: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
8680: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
8690: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
86a0: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
86b0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
86c0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
86d0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
86e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
86f0: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
8700: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
8710: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
8720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8730: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8740: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8750: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
8760: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
8770: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
8780: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
8790: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
87a0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
87b0: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
87c0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
87d0: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
87e0: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
87f0: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
8800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8810: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
8820: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8830: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
8840: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
8850: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8860: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8870: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8880: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8890: 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  a;.    if( pSche
88a0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ma ){.      for(
88b0: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
88c0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
88d0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
88e0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
88f0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
8900: 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71  ab = (Table *)sq
8910: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
8920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
8930: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73  irtual(pTab) ) s
8940: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
8950: 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a  nect(db, pTab);.
8960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8970: 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65  }.  for(p=sqlite
8980: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8990: 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71  Module); p; p=sq
89a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
89b0: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
89c0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
89d0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
89e0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
89f0: 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20  pEpoTab ){.     
8a00: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8a10: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d  onnect(db, pMod-
8a20: 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d  >pEpoTab);.    }
8a30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
8a40: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
8a50: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
8a60: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
8a70: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
8a80: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
8a90: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
8aa0: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
8ab0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
8ac0: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
8ad0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
8ae0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8af0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
8b00: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
8b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
8b20: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8b30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8b40: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
8b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
8b70: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
8b80: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
8b90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
8ba0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
8bb0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8bc0: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
8bd0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
8be0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
8bf0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
8c00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8c20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
8c30: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
8c40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8c50: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
8c60: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
8c70: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
8c80: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
8c90: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
8ca0: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
8cb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
8cc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
8cd0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
8ce0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
8cf0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
8d00: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
8d10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8d20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
8d30: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
8d40: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
8d50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8d60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
8d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8d80: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8d90: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
8da0: 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54  ->mTrace & SQLIT
8db0: 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b  E_TRACE_CLOSE ){
8dc0: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
8dd0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8de0: 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72  SE, db->pTraceAr
8df0: 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a  g, db, 0);.  }..
8e00: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
8e10: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
8e20: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
8e30: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
8e40: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
8e50: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
8e60: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
8e70: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
8e80: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
8e90: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
8ea0: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
8eb0: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
8ec0: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
8ed0: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
8ee0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
8ef0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
8f00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
8f10: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
8f20: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
8f30: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
8f40: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
8f50: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
8f60: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
8f70: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
8f80: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
8f90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
8fa0: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
8fb0: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
8fc0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
8fd0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
8fe0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
8ff0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
9000: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
9010: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
9020: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
9030: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
9040: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
9050: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
9060: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
9070: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
9080: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
9090: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
90a0: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
90b0: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
90c0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
90d0: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
90e0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
90f0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
9100: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
9110: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
9120: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
9130: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9140: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
9150: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
9160: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
9170: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
9180: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
9190: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
91a0: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
91b0: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
91c0: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
91d0: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
91e0: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
91f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
9200: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
9210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
9220: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
9230: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
9240: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
9250: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9260: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
9270: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
9280: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
9290: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
92a0: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
92b0: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
92c0: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
92d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
92e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
92f0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
9300: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
9310: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
9320: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
9330: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
9340: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
9350: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
9360: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
9370: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
9380: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
9390: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
93a0: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
93b0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
93c0: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
93d0: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
93e0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
93f0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
9400: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
9410: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
9420: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
9430: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
9440: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
9450: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
9460: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
9470: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
9480: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
9490: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
94a0: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
94b0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
94c0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
94d0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
94e0: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
94f0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
9500: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
9510: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
9520: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
9530: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
9540: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
9550: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
9560: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
9570: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9580: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
9590: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
95a0: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
95b0: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
95c0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
95d0: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
95e0: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
95f0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
9600: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
9610: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
9620: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
9630: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
9640: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
9650: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9660: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9670: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
9680: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
9690: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
96a0: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
96b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
96c0: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
96d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
96e0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
96f0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
9700: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
9710: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
9720: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
9730: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
9740: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
9750: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
9760: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
9770: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
9780: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
9790: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
97a0: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
97b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
97c0: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
97d0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
97e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
97f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9800: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9810: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
9820: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
9830: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
9840: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9850: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
9860: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
9870: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
9880: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
9890: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
98a0: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
98b0: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
98c0: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
98d0: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
98e0: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
98f0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
9900: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
9910: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
9920: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
9930: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
9940: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
9950: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
9960: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
9970: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
9980: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
9990: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
99a0: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
99b0: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
99c0: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
99d0: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
99e0: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
99f0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
9a00: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
9a10: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
9a20: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
9a30: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9a40: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
9a50: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
9a60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
9a70: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
9a80: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
9a90: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
9aa0: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
9ab0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
9ac0: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
9ad0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
9ae0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
9af0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
9b00: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
9b10: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
9b20: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
9b30: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
9b40: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
9b50: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
9b60: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
9b70: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
9b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b90: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
9ba0: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
9bb0: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
9bc0: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
9bd0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
9be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
9bf0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
9c00: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
9c10: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
9c20: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
9c30: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
9c40: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
9c50: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
9c60: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
9c70: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
9c80: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
9c90: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
9ca0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
9cb0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
9cc0: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
9cd0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
9ce0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
9cf0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
9d00: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
9d10: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
9d20: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
9d30: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
9d40: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
9d50: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
9d60: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
9d70: 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
9d80: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9d90: 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Func); i; i=sqli
9da0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9db0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65      FuncDef *pNe
9dc0: 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xt, *p;.    p = 
9dd0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9de0: 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
9df0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
9e00: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9e10: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
9e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9e30: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
9e40: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
9e50: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
9e60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9e70: 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63  Clear(&db->aFunc
9e80: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
9e90: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9ea0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
9eb0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9ec0: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
9ed0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
9ee0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
9ef0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
9f00: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
9f10: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
9f20: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
9f30: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
9f40: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
9f50: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
9f60: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
9f70: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
9f80: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
9f90: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
9fa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9fb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9fc0: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
9fd0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
9fe0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
9ff0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a000: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a010: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
a020: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
a030: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
a040: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
a050: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
a060: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
a070: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
a080: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
a090: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
a0a0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
a0b0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
a0c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a0d0: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
a0e0: 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64  leClear(db, pMod
a0f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
a100: 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  Free(db, pMod);.
a110: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
a120: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64  hClear(&db->aMod
a130: 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
a140: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
a150: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20   SQLITE_OK); /* 
a160: 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20  Deallocates any 
a170: 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72  cached error str
a180: 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ings. */.  sqlit
a190: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
a1a0: 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pErr);.  sqlite3
a1b0: 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28  CloseExtensions(
a1c0: 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db);.#if SQLITE_
a1d0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
a1e0: 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ION.  sqlite3_fr
a1f0: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
a200: 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  hUser);.  sqlite
a210: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
a220: 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66  zAuthPW);.#endif
a230: 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
a240: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
a250: 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65  OR;..  /* The te
a260: 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65  mp-database sche
a270: 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ma is allocated 
a280: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
a290: 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d   the other schem
a2a0: 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28  a.  ** objects (
a2b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c  using sqliteMall
a2c0: 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69  oc() directly, i
a2d0: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
a2e0: 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e  3BtreeSchema()).
a2f0: 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64  .  ** So it need
a300: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65  s to be freed he
a310: 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f  re. Todo: Why no
a320: 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20  t roll the temp 
a330: 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a  schema into.  **
a340: 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65   the same sqlite
a350: 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20  Malloc() as the 
a360: 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74  one that allocat
a370: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
a380: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f  .  ** structure?
a390: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
a3a0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
a3b0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
a3c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a3d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a3e0: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
a3f0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
a400: 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ED;.  sqlite3_mu
a410: 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74  tex_free(db->mut
a420: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
a430: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
a440: 73 65 64 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a  sed(db,0)==0 );.
a450: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
a460: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
a470: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a480: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
a490: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73  pStart);.  }.  s
a4a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
a4b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
a4c0: 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ck all database 
a4d0: 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43  files.  If tripC
a4e0: 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
a4f0: 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  E_OK, then.** an
a500: 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
a510: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
a520: 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20  ("tripped" - as 
a530: 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63  in "tripping a c
a540: 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65  ircuit.** breake
a550: 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20  r") and made to 
a560: 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20  return tripCode 
a570: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
a580: 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65   further.** atte
a590: 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74  mpts to use that
a5a0: 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63   cursor.  Read c
a5b0: 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70  ursors remain op
a5c0: 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20  en and valid.** 
a5d0: 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22 20  but are "saved" 
a5e0: 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62 6c  in case the tabl
a5f0: 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65  e pages are move
a600: 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69  d around..*/.voi
a610: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
a620: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
a630: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
a640: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a650: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69  inTrans = 0;.  i
a660: 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b  nt schemaChange;
a670: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a680: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
a690: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
a6a0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
a6b0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
a6c0: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
a6d0: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
a6e0: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
a6f0: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
a700: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
a710: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
a720: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
a730: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
a740: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
a750: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
a760: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
a770: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
a780: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
a790: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
a7a0: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
a7b0: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
a7c0: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
a7d0: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
a7e0: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
a7f0: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
a800: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
a810: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
a820: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
a830: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
a840: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
a850: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
a860: 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e  b);.  schemaChan
a870: 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61  ge = (db->mDbFla
a880: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
a890: 6d 61 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20  maChange)!=0 && 
a8a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a8b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
a8c0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a8d0: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
a8e0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
a8f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a900: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
a910: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
a920: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
a930: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a940: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a950: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
a960: 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61  Code, !schemaCha
a970: 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nge);.    }.  }.
a980: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
a990: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
a9a0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
a9b0: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63  loc();..  if( sc
a9c0: 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
a9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
a9e0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
a9f0: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  s(db, 0);.    sq
aa00: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
aa10: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
aa20: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
aa30: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
aa40: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
aa50: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
aa60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
aa70: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
aa80: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
aa90: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
aaa0: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
aab0: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
aac0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
aad0: 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72  u64)SQLITE_Defer
aae0: 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  FKs;..  /* If on
aaf0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
ab00: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
ab10: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
ab20: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
ab30: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
ab40: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
ab50: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
ab60: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
ab70: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
ab80: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
ab90: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
aba0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
abb0: 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74  atic string cont
abc0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
abd0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
abe0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
abf0: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ** specified in 
ac00: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
ac10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
ac20: 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d  ITE_NEED_ERR_NAM
ac30: 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  E).const char *s
ac40: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
ac50: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
ac60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
ac70: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
ac80: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
ac90: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
aca0: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
acb0: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
acc0: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
acd0: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
acf0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ad20: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ad40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
ad50: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
ad60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ad70: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  se SQLITE_ERROR_
ad80: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e  SNAPSHOT:     zN
ad90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
ada0: 52 4f 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  ROR_SNAPSHOT";  
adb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
adc0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
add0: 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NAL:           z
ade0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
adf0: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20  NTERNAL";       
ae00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae10: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
ae20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ae30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ae40: 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20  PERM";          
ae50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
ae70: 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RT:             
ae80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ae90: 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20  _ABORT";        
aea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aeb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
aec0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20  ORT_ROLLBACK:   
aed0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aee0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
aef0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
af00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
af10: 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  USY:            
af20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
af30: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
af40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
af50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af60: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  BUSY_RECOVERY:  
af70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af80: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
af90: 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Y";     break;. 
afa0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afb0: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20  _BUSY_SNAPSHOT: 
afc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
afd0: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
afe0: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
aff0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b000: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20  E_LOCKED:       
b010: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b020: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20  QLITE_LOCKED";  
b030: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b040: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b050: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
b060: 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22  CACHE: zName = "
b070: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
b080: 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b  AREDCACHE";break
b090: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0a0: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
b0b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b0c0: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20  "SQLITE_NOMEM"; 
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b0e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b0f0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
b100: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b110: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b120: 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  Y";          bre
b130: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b140: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b150: 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20  ECOVERY:  zName 
b160: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b170: 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72  LY_RECOVERY"; br
b180: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b190: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b1a0: 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65  CANTINIT:  zName
b1b0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b1c0: 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62  NLY_CANTINIT"; b
b1d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1e0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b1f0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d  _ROLLBACK:  zNam
b200: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b210: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  ONLY_ROLLBACK"; 
b220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b230: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b240: 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61  Y_DBMOVED:   zNa
b250: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b260: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20  DONLY_DBMOVED"; 
b270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b280: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b290: 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e  LY_DIRECTORY: zN
b2a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b2b0: 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59  ADONLY_DIRECTORY
b2c0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b2d0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
b2e0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
b2f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b300: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
b310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b320: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b330: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
b340: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b350: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
b360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b370: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b380: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
b390: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3a0: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
b3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b3d0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
b3e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b3f0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
b400: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
b410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b420: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
b430: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b440: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
b450: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b460: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b470: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
b480: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b490: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
b4a0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b4b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b4c0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
b4d0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b4e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
b4f0: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
b500: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b510: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
b520: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
b540: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
b550: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b560: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
b570: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
b590: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
b5a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5b0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b5c0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b5d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
b5e0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
b5f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b600: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
b610: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b620: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
b630: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
b640: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b650: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b660: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
b670: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b680: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
b690: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
b6b0: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
b6c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b6d0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
b6e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
b700: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
b710: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b720: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
b730: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b740: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b750: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b760: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b790: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b7a0: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
b7b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b7c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
b7d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b7e0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
b7f0: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
b800: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b810: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b820: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b830: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b840: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
b850: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b860: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b870: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
b880: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b890: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
b8a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b8b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b8c0: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
b8d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b8e0: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
b8f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b900: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b910: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
b920: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b930: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
b940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b950: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b960: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
b970: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b980: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
b990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b9a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b9b0: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
b9c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b9d0: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
b9e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b9f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ba00: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
ba10: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba20: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
ba30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ba40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ba50: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
ba60: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ba70: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
ba80: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
ba90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
baa0: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
bab0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bac0: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
bad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bae0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
baf0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
bb00: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
bb10: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
bb20: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
bb30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bb40: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20  IOERR_CONVPATH: 
bb50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bb60: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
bb70: 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TH";    break;. 
bb80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bb90: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
bba0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bbb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
bbc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bbd0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bbe0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
bbf0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bc00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
bc10: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
bc20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bc30: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
bc40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bc50: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
bc60: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
bc70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bc80: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
bc90: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bca0: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bcc0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bcd0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
bce0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bcf0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bd00: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
bd10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bd20: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
bd30: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
bd40: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bd50: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
bd60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bd70: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bd80: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
bd90: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bda0: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
bdb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bdc0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bdd0: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
bde0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bdf0: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
be00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be10: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
be20: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
be30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
be40: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
be50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be60: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
be70: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
be80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
be90: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
bea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
beb0: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
bec0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bed0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
bee0: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
bef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf00: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
bf10: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
bf20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf30: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
bf40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bf50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
bf60: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
bf70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bf80: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
bf90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bfa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bfb0: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
bfc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bfd0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
bfe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bff0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c000: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
c010: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
c020: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
c030: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
c040: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c050: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
c060: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
c070: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
c080: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
c090: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c0a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
c0b0: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c0e0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c0f0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
c100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c110: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c120: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
c130: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c140: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
c150: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
c160: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c170: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
c180: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c1b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
c1c0: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
c1d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c1e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c1f0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
c200: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c210: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
c220: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c230: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c240: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c270: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c280: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c290: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
c2a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c2b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c2c0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
c2d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c2e0: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
c2f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c300: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c310: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c340: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c350: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
c360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c370: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c380: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
c390: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c3a0: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
c3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c3c0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
c3d0: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
c3e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c3f0: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
c400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c410: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
c420: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
c430: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c440: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
c450: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c460: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
c470: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
c480: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c490: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
c4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
c4c0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
c4d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c4e0: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
c4f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c500: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c510: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
c520: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c530: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
c540: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c550: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c560: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
c570: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c580: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
c590: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c5a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c5b0: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
c5c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c5d0: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
c5e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c5f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c600: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
c610: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c620: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
c630: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c640: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c650: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
c660: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c670: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
c680: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c690: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c6a0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c6b0: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
c6c0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c6d0: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
c6e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c6f0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c700: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c730: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c740: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c750: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
c760: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c770: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
c780: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c790: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
c7a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c7b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c7c0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c7d0: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
c7e0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c7f0: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
c800: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c810: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
c820: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c830: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
c840: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c860: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
c870: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
c880: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
c890: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c8a0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
c8b0: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
c8c0: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
c8d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
c8e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c8f0: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
c900: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c910: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
c920: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
c930: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
c940: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
c950: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
c960: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
c970: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
c980: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
c990: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
c9a0: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
c9b0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
c9c0: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
c9d0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c9e0: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
c9f0: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
ca00: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
ca10: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
ca20: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
ca30: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
ca40: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
ca50: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
ca60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
ca70: 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72  T       */ "quer
ca80: 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20  y aborted",.    
ca90: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
caa0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
cab0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
cac0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
cad0: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
cae0: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
caf0: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
cb00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
cb10: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
cb20: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
cb30: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
cb40: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
cb50: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
cb60: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
cb70: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
cb80: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
cb90: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
cba0: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
cbb0: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
cbc0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
cbd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
cbe0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
cbf0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
cc00: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
cc10: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
cc20: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
cc30: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
cc40: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
cc50: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
cc60: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
cc70: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cc80: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
cc90: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
cca0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
ccb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
ccc0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
ccd0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
cce0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
ccf0: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  PTY       */ 0,.
cd00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
cd10: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
cd20: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
cd30: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
cd40: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
cd50: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
cd60: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
cd70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cd80: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
cd90: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
cda0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cdb0: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
cdc0: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
cdd0: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
cde0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
cdf0: 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74   */ "bad paramet
ce00: 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20  er or other API 
ce10: 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20  misuse",.#ifdef 
ce20: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
ce30: 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  FS.    /* SQLITE
ce40: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
ce50: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
ce60: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
ce70: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  ,.#else.    /* S
ce80: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
ce90: 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20    */ 0,.#endif. 
cea0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
ceb0: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
cec0: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
ced0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
cee0: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
cef0: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
cf00: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
cf10: 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f   "column index o
cf20: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
cf30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
cf40: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
cf50: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
cf60: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
cf70: 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a  TE_NOTICE      *
cf80: 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  / "notification 
cf90: 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a  message",.    /*
cfa0: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20   SQLITE_WARNING 
cfb0: 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20      */ "warning 
cfc0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20  message",.  };. 
cfd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
cfe0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
cff0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
d000: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
d010: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
d020: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
d030: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
d040: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
d050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d060: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d070: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ROW: {.      zEr
d080: 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77  r = "another row
d090: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
d0a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d0b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d0c0: 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45  DONE: {.      zE
d0d0: 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f  rr = "no more ro
d0e0: 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ws available";. 
d0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d100: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
d110: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
d120: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
d130: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
d140: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
d150: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
d160: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
d170: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
d180: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d1a0: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
d1b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d1c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
d1d0: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
d1e0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
d1f0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
d200: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
d210: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
d220: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d230: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
d240: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d250: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
d260: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d270: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d280: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
d290: 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f   to retry the lo
d2a0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ck.  Return zero
d2b0: 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a   to stop trying.
d2c0: 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c  ** and cause SQL
d2d0: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
d2e0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74  LITE_BUSY..*/.st
d2f0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
d300: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d310: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c  ck(.  void *ptr,
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d330: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d340: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63  ction */.  int c
d350: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
d360: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d370: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
d380: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   been busy */.  
d390: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
d3a0: 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ile      /* The 
d3b0: 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
d3c0: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20  e lock occurred 
d3d0: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
d3e0: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
d3f0: 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73  USLEEP.  /* This
d400: 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73   case is for sys
d410: 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73  tems that have s
d420: 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70  upport for sleep
d430: 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e  ing for fraction
d440: 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f  s of.  ** a seco
d450: 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20  nd.  Examples:  
d460: 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74  All windows syst
d470: 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d  ems, unix system
d480: 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20  s with usleep() 
d490: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
d4a0: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
d4b0: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
d4c0: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
d4d0: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
d4e0: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
d4f0: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
d500: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
d510: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
d520: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
d530: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
d540: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
d550: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
d560: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
d570: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d580: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d590: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d5a0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
d5b0: 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51  rior;..#ifdef SQ
d5c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d5d0: 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20  K_TIMEOUT.  if( 
d5e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d5f0: 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54  trol(pFile,SQLIT
d600: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d610: 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51  EOUT,&tmout)==SQ
d620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d630: 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  f( count ){.    
d640: 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20    tmout = 0;.   
d650: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
d660: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
d670: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
d680: 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74  _TIMEOUT, &tmout
d690: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d6a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d6b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d6c0: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d6d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d6e0: 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
d6f0: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
d700: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
d710: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
d720: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d730: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
d740: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
d750: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
d760: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d770: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
d780: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
d790: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
d7a0: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
d7b0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
d7c0: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d  ior + delay > tm
d7d0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
d7e0: 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72   = tmout - prior
d7f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
d800: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d810: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d820: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
d830: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
d840: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 1;.#else.  /
d850: 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20  * This case for 
d860: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61  unix systems tha
d870: 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20  t lack usleep() 
d880: 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69  support.  Sleepi
d890: 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  ng.  ** must be 
d8a0: 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e  done in incremen
d8b0: 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f  ts of whole seco
d8c0: 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nds */.  sqlite3
d8d0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
d8e0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f  *)ptr;.  int tmo
d8f0: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
d900: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
d910: 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ut;.  UNUSED_PAR
d920: 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20  AMETER(pFile);. 
d930: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
d940: 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  000 > tmout ){. 
d950: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d960: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d970: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
d980: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d990: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
d9a0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d9b0: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
d9c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d9d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d9e0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
d9f0: 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72  failed to acquir
da00: 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56  e a.** lock on V
da10: 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a  FS file pFile..*
da20: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
da30: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
da40: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
da50: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
da60: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
da70: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
da80: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
da90: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
daa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
dab0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
dac0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c  (BusyHandler *p,
dad0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
dae0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
daf0: 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48  .  if( p->xBusyH
db00: 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e  andler==0 || p->
db10: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
db20: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78   0;.  if( p->bEx
db30: 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20  traFileArg ){.  
db40: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72    /* Add an extr
db50: 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68  a parameter with
db60: 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74   the pFile point
db70: 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  er to the end of
db80: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
db90: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69  back argument li
dba0: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a  st */.    int (*
dbb0: 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xTra)(void*,int,
dbc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
dbd0: 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28      xTra = (int(
dbe0: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  *)(void*,int,sql
dbf0: 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78  ite3_file*))p->x
dc00: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
dc10: 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42   rc = xTra(p->pB
dc20: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
dc30: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73  , pFile);.  }els
dc40: 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79  e{.    /* Legacy
dc50: 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64   style busy hand
dc60: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ler callback */.
dc70: 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73      rc = p->xBus
dc80: 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73  yHandler(p->pBus
dc90: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  yArg, p->nBusy);
dca0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
dcb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
dcc0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
dcd0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
dce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dcf0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
dd00: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
dd10: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
dd20: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
dd30: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
dd40: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
dd50: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
dd60: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
dd70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
dd80: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
dd90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
dda0: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
ddb0: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
ddc0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
ddd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
dde0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
ddf0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
de00: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
de10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
de20: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
de30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
de40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
de50: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
de60: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
de70: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
de80: 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20  andler.pBusyArg 
de90: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
dea0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
deb0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
dec0: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
ded0: 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eArg = 0;.  db->
dee0: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
def0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
df00: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
df10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
df20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
df30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
df40: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
df50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
df60: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
df70: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
df80: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
df90: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
dfa0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
dfb0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
dfc0: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
dfd0: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
dfe0: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
dff0: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
e000: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
e010: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
e020: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
e030: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
e040: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
e050: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
e060: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
e070: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
e080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e090: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e0a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e0b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
e0c0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e0d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e0e0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
e0f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e100: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e110: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
e120: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
e130: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
e140: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
e150: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
e160: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
e170: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
e180: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
e190: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
e1a0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
e1b0: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
e1c0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e1d0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
e1e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e1f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
e200: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
e210: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
e220: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
e230: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
e240: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
e250: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
e260: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
e270: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
e280: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
e290: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
e2a0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
e2b0: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
e2c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e2d0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e2e0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e2f0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
e300: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e310: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
e320: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
e330: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e340: 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f  r(db, (int(*)(vo
e350: 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44  id*,int))sqliteD
e360: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
e370: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
e3a0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
e3b0: 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62   = ms;.    db->b
e3c0: 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72  usyHandler.bExtr
e3d0: 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20  aFileArg = 1;.  
e3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e3f0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e400: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
e410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e420: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
e430: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
e440: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
e450: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
e460: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
e470: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
e480: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
e490: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
e4a0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e4b0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e4c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e4d0: 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c  db) && (db==0 ||
e4e0: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
e4f0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29  TE_MAGIC_ZOMBIE)
e500: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e510: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e530: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
e540: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
e550: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
e560: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e570: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
e580: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
e590: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
e5a0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
e5b0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
e5c0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
e5d0: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
e5e0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
e5f0: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
e600: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
e610: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e620: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
e630: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
e640: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
e650: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
e660: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
e670: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e680: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
e690: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e6a0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e6b0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e6c0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
e6d0: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
e6e0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e6f0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e700: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e710: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e720: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e730: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e740: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e750: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e760: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e770: 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73  void (*xValue)(s
e780: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e790: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65  ,.  void (*xInve
e7a0: 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  rse)(sqlite3_con
e7b0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e7c0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46  3_value **),.  F
e7d0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e7e0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
e7f0: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
e800: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
e810: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
e820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e830: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e840: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e850: 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53   xValue==0 || xS
e860: 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Func==0 );.  if(
e870: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
e880: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e890: 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20   /* Must have a 
e8a0: 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  valid name */.  
e8b0: 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26   || (xSFunc!=0 &
e8c0: 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20  & xFinal!=0)    
e8d0: 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20      /* Not both 
e8e0: 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61  xSFunc and xFina
e8f0: 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69  l */.   || ((xFi
e900: 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d  nal==0)!=(xStep=
e910: 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f  =0))       /* Bo
e920: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
e930: 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65   xFinal and xSte
e940: 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61  p */.   || ((xVa
e950: 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72  lue==0)!=(xInver
e960: 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f  se==0))    /* Bo
e970: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
e980: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
e990: 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67  e */.   || (nArg
e9a0: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
e9b0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
e9c0: 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c  ARG).   || (255<
e9d0: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
e9e0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
e9f0: 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a  ionName))).  ){.
ea00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ea10: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ea20: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
ea30: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41  LITE_FUNC_CONSTA
ea40: 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52  NT==SQLITE_DETER
ea50: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78  MINISTIC );.  ex
ea60: 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26  traFlags = enc &
ea70: 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49    SQLITE_DETERMI
ea80: 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d  NISTIC;.  enc &=
ea90: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e   (SQLITE_FUNC_EN
eaa0: 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59  CMASK|SQLITE_ANY
eab0: 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51  );.  .#ifndef SQ
eac0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
ead0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
eae0: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
eaf0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
eb00: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
eb10: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
eb20: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
eb30: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
eb40: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
eb50: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
eb60: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
eb70: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
eb80: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
eb90: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
eba0: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
ebb0: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
ebc0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
ebd0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
ebe0: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
ebf0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
ec00: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
ec10: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
ec20: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ec30: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
ec40: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
ec50: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
ec60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
ec70: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
ec80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
ec90: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65  g, SQLITE_UTF8|e
eca0: 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20  xtraFlags,.     
ecb0: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
ecc0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
ecd0: 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49  inal, xValue, xI
ece0: 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63  nverse, pDestruc
ecf0: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
ed00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ed10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ed20: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ed30: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ed40: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
ed50: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
ed60: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
ed70: 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  ata, xSFunc, xSt
ed80: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c  ep, xFinal, xVal
ed90: 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44  ue, xInverse, pD
eda0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
edb0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
edc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
edd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ede0: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
edf0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
ee00: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
ee10: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
ee20: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
ee30: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
ee40: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
ee50: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
ee60: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
ee70: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
ee80: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
ee90: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
eea0: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
eeb0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
eec0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
eed0: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
eee0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
eef0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
ef00: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
ef10: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
ef20: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
ef30: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
ef40: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
ef50: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
ef60: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
ef70: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
ef80: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
ef90: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
efa0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
efb0: 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e  NCMASK)==(u32)en
efc0: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
efd0: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
efe0: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
eff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f000: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
f010: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
f020: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
f030: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
f040: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
f050: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
f060: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
f070: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f080: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
f090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
f0a0: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
f0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f0c0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
f0d0: 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  ments(db, 0);.  
f0e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
f0f0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
f100: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
f110: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
f120: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
f130: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
f140: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
f150: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
f160: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f170: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
f180: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
f190: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
f1a0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
f1b0: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
f1c0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
f1d0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
f1e0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
f1f0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
f200: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
f210: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
f220: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
f230: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
f240: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
f250: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
f260: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
f270: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
f280: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
f290: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
f2a0: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
f2b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
f2c0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f2d0: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
f2e0: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
f2f0: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
f300: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
f310: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
f320: 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20  al;.  p->xValue 
f330: 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78  = xValue;.  p->x
f340: 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72  Inverse = xInver
f350: 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  se;.  p->pUserDa
f360: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
f370: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
f380: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
f390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f3a0: 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74  .** Worker funct
f3b0: 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d  ion used by utf-
f3c0: 38 20 41 50 49 73 20 74 68 61 74 20 63 72 65 61  8 APIs that crea
f3d0: 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73  te new functions
f3e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
f3f0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f400: 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74  on().**    sqlit
f410: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f420: 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71  on_v2().**    sq
f430: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e  lite3_create_win
f440: 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a  dow_function().*
f450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
f460: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a  ateFunctionApi(.
f470: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
f490: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
f4a0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
f4b0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
f4c0: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
f4d0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f4e0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
f4f0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
f500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f510: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f520: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
f530: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
f540: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
f550: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
f560: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
f570: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
f580: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f590: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f5a0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  ue**),.  void(*x
f5b0: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a  Destroy)(void*).
f5c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f5d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
f5e0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
f5f0: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
f600: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f610: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f620: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f630: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
f640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f650: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
f660: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f670: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f680: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
f690: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
f6a0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
f6b0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  tor *)sqlite3Mal
f6c0: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44  loc(sizeof(FuncD
f6d0: 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20  estructor));.   
f6e0: 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20   if( !pArg ){.  
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
f700: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78  ult(db);.      x
f710: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f720: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
f730: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66  }.    pArg->nRef
f740: 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e   = 0;.    pArg->
f750: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
f760: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
f770: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
f780: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f790: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
f7a0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
f7b0: 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e   p, .      xSFun
f7c0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
f7d0: 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  , xValue, xInver
f7e0: 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20  se, pArg.  );.  
f7f0: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
f800: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f810: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f820: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
f830: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
f840: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72 67  qlite3_free(pArg
f850: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
f860: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f870: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f880: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f890: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f8b0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
f8c0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
f8d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
f8e0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
f8f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
f910: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
f920: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
f930: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
f940: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
f950: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f960: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
f970: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
f980: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f990: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f9a0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
f9b0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
f9c0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72  context*).){.  r
f9d0: 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63  eturn createFunc
f9e0: 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e  tionApi(db, zFun
f9f0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
fa00: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30      xFinal, 0, 0
fa40: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
fa50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
fa60: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
fa70: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
fa80: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
fa90: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
faa0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
fab0: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
fac0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fad0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fae0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
faf0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
fb00: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fb10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
fb20: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
fb30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fb40: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
fb50: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
fb60: 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65  .  return create
fb70: 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20  FunctionApi(db, 
fb80: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
fb90: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
fba0: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fbd0: 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b  0, 0, xDestroy);
fbe0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  .}.int sqlite3_c
fbf0: 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e  reate_window_fun
fc00: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
fc10: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
fc20: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
fc30: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
fc40: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fc50: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
fc60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fc70: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fc80: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
fc90: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
fca0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
fcb0: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
fcc0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
fcd0: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
fce0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fcf0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
fd00: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
fd10: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
fd20: 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  *).){.  return c
fd30: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69  reateFunctionApi
fd40: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
fd50: 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74  , enc, p, 0, xSt
fd60: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fd90: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
fda0: 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a  , xDestroy);.}..
fdb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fdc0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
fdd0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
fde0: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
fdf0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
fe00: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
fe10: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
fe20: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
fe30: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fe40: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
fe50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fe60: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
fe70: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
fe80: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
fe90: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fea0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
feb0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
fec0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
fed0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
fee0: 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
fef0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ff00: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
ff10: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
ff20: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
ff30: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
ff40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ff50: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
ff60: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ff70: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ff80: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
ff90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ffa0: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
ffb0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
ffc0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
ffd0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
ffe0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
fff0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
10000 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
10010 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
10020 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c  p, xSFunc,xStep,
10030 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20  xFinal,0,0,0);. 
10040 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10050 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
10060 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
10070 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
10080 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10090 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
100a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
100b0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
100c0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
100d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
100e0 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  f an SQL functio
100f0 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a  n that always.**
10100 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65   fails with an e
10110 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61  rror message sta
10120 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 66 75  ting that the fu
10130 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  nction is used i
10140 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63  n the.** wrong c
10150 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c  ontext.  The sql
10160 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
10170 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67  nction() API mig
10180 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20  ht construct.** 
10190 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
101a0 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  t use this routi
101b0 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ne so that the f
101c0 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78  unctions will ex
101d0 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20  ist.** for name 
101e0 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61  resolution but a
101f0 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72  re actually over
10200 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 78 46  loaded by the xF
10210 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  indFunction.** m
10220 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c  ethod of virtual
10230 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
10240 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49  ic void sqlite3I
10250 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a  nvalidFunction(.
10260 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
10270 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20  t *context,  /* 
10280 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  The function cal
10290 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ling context */.
102a0 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20    int NotUsed,  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
102d0 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
102e0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
102f0 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
10300 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20  2   /* Value of 
10310 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
10320 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
10330 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
10340 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75   char*)sqlite3_u
10350 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
10360 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  );.  char *zErr;
10370 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10380 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
10390 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20  tUsed2);.  zErr 
103a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
103b0 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65  f(.      "unable
103c0 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
103d0 20 25 73 20 69 6e 20 74 68 65 20 72 65 71 75 65   %s in the reque
103e0 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a  sted context", z
103f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
10400 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
10410 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29  ntext, zErr, -1)
10420 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
10430 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zErr);.}../*.**
10440 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
10450 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
10460 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
10470 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
10480 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
10490 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
104a0 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
104b0 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
104c0 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
104d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
104e0 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
104f0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
10500 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
10510 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
10520 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
10530 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
10540 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
10550 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
10560 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
10570 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
10580 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
10590 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
105a0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
105b0 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
105c0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
105d0 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
105e0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
105f0 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
10600 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
10610 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
10620 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
10630 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
10640 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
10650 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
10660 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
10670 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
10680 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  rc;.  char *zCop
10690 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y;..#ifdef SQLIT
106a0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
106b0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
106c0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
106d0 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c  b) || zName==0 |
106e0 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20  | nArg<-2 ){.   
106f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10700 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
10710 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10720 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10730 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20  >mutex);.  rc = 
10740 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
10750 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
10760 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
10770 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  , 0)!=0;.  sqlit
10780 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10790 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
107a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c   rc ) return SQL
107b0 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20  ITE_OK;.  zCopy 
107c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
107d0 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  f(zName);.  if( 
107e0 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72  zCopy==0 ) retur
107f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10800 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10810 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
10820 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  _v2(db, zName, n
10830 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
10840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
10860 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  py, sqlite3Inval
10870 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
10880 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
10890 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
108a0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
108b0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
108c0 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
108d0 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
108e0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
108f0 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
10900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
10910 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
10920 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
10930 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
10940 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
10950 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
10960 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
10970 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
10980 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
10990 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
109a0 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
109b0 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ment..*/.#ifndef
109c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
109d0 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71  RECATED.void *sq
109e0 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
109f0 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78  te3 *db, void(*x
10a00 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
10a10 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
10a20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
10a30 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
10a40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10a50 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10a60 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10a70 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10a80 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10a90 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
10aa0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
10ab0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10ac0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10ad0 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
10ae0 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
10af0 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 20  mTrace = xTrace 
10b00 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c  ? SQLITE_TRACE_L
10b10 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d  EGACY : 0;.  db-
10b20 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a  >xTrace = (int(*
10b30 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64  )(u32,void*,void
10b40 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b  *,void*))xTrace;
10b50 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
10b60 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10b70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10b80 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10b90 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
10ba0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10bb0 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
10bc0 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  ./* Register a t
10bd0 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73  race callback us
10be0 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d  ing the version-
10bf0 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  2 interface..*/.
10c00 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63  int sqlite3_trac
10c10 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  e_v2(.  sqlite3 
10c20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73     /* Trace this
10c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10c60 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65   unsigned mTrace
10c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10c90 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f  ask of events to
10ca0 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20   be traced */.  
10cb0 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73  int(*xTrace)(uns
10cc0 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64  igned,void*,void
10cd0 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61  *,void*),  /* Ca
10ce0 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
10cf0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29   /* Context */.)
10d30 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10d40 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10d50 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10d60 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10d80 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10d90 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
10da0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10db0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10dc0 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20    if( mTrace==0 
10dd0 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ) xTrace = 0;.  
10de0 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20  if( xTrace==0 ) 
10df0 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62  mTrace = 0;.  db
10e00 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63  ->mTrace = mTrac
10e10 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  e;.  db->xTrace 
10e20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
10e30 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
10e40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
10e50 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10e60 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
10e70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
10e80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10e90 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
10ea0 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
10eb0 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
10ec0 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
10ed0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
10ee0 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
10ef0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
10f00 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
10f10 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
10f20 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
10f30 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
10f40 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
10f50 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
10f60 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
10f70 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
10f80 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
10f90 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
10fa0 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
10fb0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
10fc0 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
10fd0 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
10fe0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
10ff0 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
11000 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
11010 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
11020 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
11030 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
11040 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
11050 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11060 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
11070 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
11080 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
11090 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
110a0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
110b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
110c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
110d0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
110e0 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
110f0 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
11100 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
11110 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
11120 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
11130 64 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51  db->mTrace &= SQ
11140 4c 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45  LITE_TRACE_NONLE
11150 47 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28  GACY_MASK;.  if(
11160 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20   db->xProfile ) 
11170 64 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51  db->mTrace |= SQ
11180 4c 49 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46  LITE_TRACE_XPROF
11190 49 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ILE;.  sqlite3_m
111a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
111b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
111c0 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
111d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
111e0 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64  PRECATED */.#end
111f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11200 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  T_TRACE */../*.*
11210 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e  * Register a fun
11220 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
11230 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ked when a trans
11240 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a  action commits..
11250 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
11260 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
11270 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
11280 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
11290 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
112a0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
112b0 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
112c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112e0 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
112f0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
11300 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
11310 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
11320 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
11330 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
11340 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
11350 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11360 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
11370 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
11380 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
11390 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
113a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
113b0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
113c0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
113d0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
113e0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
113f0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
11400 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11420 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11430 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
11440 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
11450 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
11460 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
11470 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
11480 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
11490 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
114a0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
114b0 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
114c0 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
114d0 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
114e0 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
114f0 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
11500 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
11510 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
11520 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11530 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
11540 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
11550 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
11560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11570 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
11580 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
11590 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
115a0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
115b0 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
115c0 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
115d0 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
115e0 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
115f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
11600 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
11610 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
11620 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
11630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
11640 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
11650 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11660 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
11670 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
11680 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
11690 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
116a0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
116b0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
116c0 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
116d0 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
116e0 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
116f0 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
11700 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
11710 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11730 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11740 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11750 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
11760 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
11770 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
11780 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11790 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
117a0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
117b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
117c0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
117d0 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
117e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
117f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
11800 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
11810 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
11820 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
11830 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
11840 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
11850 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
11880 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
11890 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
118a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
118b0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
118c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
118d0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
118e0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
118f0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
11900 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11910 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
11920 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11930 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
11940 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
11950 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
11960 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
11970 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11980 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
11990 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
119a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
119b0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
119c0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  n pRet;.}..#ifde
119d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
119e0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
119f0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
11a00 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
11a10 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
11a20 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
11a30 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
11a40 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
11a50 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
11a60 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
11a70 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70  d *sqlite3_preup
11a80 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
11a90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11aa0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
11ab0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
11ac0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
11ad0 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29  void(*xCallback)
11ae0 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  (         /* Cal
11af0 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
11b00 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69  /.    void*,sqli
11b10 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  te3*,int,char co
11b20 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a  nst*,char const*
11b30 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73  ,sqlite3_int64,s
11b40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20  qlite3_int64),. 
11b50 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
11b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11b70 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  rst callback arg
11b80 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ument */.){.  vo
11b90 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
11ba0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11bb0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
11bc0 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64  et = db->pPreUpd
11bd0 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ateArg;.  db->xP
11be0 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
11bf0 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11c00 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
11c10 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11c20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11c30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11c40 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
11c50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11c60 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
11c70 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  OOK */..#ifndef 
11c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11c90 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
11ca0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
11cb0 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
11cc0 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
11cd0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
11ce0 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
11cf0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11d00 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
11d10 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
11d20 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
11d30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
11d40 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
11d50 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
11d60 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
11d70 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
11d80 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
11d90 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
11da0 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
11db0 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
11dc0 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
11dd0 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
11de0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11df0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
11e00 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
11e10 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
11e20 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
11e30 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
11e40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11e50 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
11e60 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
11e70 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
11e80 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
11e90 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
11ea0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
11eb0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11ec0 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
11ed0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
11ee0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11ef0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11f00 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
11f10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
11f20 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
11f30 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
11f40 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
11f50 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
11f60 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
11f70 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
11f80 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
11f90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
11fa0 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
11fb0 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
11fc0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
11fd0 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
11fe0 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
11ff0 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
12000 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
12010 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
12020 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
12030 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
12040 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
12050 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
12060 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
12070 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
12080 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
12090 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
120a0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
120b0 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
120c0 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
120d0 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
120e0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
120f0 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
12100 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
12110 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
12120 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
12130 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
12140 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
12150 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
12160 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
12170 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
12180 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
12190 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
121a0 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
121b0 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
121c0 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c  #else.#ifdef SQL
121d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
121e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
121f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12200 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
12210 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12220 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  ;.#endif.  if( n
12230 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
12240 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
12250 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
12260 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
12270 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
12280 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
12290 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
122a0 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
122b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
122c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
122d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
122e0 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
122f0 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
12300 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
12310 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
12320 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
12330 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
12340 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12350 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
12360 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
12370 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
123a0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
123b0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
123c0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
123d0 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
123e0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
123f0 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
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 46 69 72 73 74 20 61 72 67      /* First arg
12420 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
12430 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
12440 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
12450 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
12460 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53   *pRet;.#ifdef S
12470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
12480 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
12490 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
124a0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
124b0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
124c0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
124d0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
124e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
124f0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12500 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
12510 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
12520 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
12530 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
12540 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
12550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12560 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
12570 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
12580 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
12590 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
125a0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
125b0 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
125c0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
125d0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
125e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12600 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
12610 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12620 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
12630 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
12640 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
12650 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
12660 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
12690 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
126a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
126d0 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
126e0 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
126f0 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
12700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12710 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
12720 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
12730 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
12740 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12750 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
12760 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
12770 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
127a0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
127b0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
127c0 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
127d0 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
127e0 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
127f0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
12800 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
12810 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
12820 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
12830 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
12840 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12850 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69  #endif..  /* Ini
12860 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
12870 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
12880 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
12890 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
128a0 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
128b0 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
128c0 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
128d0 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
128e0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
128f0 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
12900 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12910 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
12920 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
12930 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
12940 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
12950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
12960 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
12970 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20  RUNCATE==3 );.  
12980 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
12990 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
129a0 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
129b0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
129c0 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f  RUNCATE ){.    /
129d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
129e0 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65  -03996-12088 The
129f0 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73   M parameter mus
12a00 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65  t be a valid che
12a10 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d  ckpoint.    ** m
12a20 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75  ode: */.    retu
12a30 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
12a40 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
12a50 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12a60 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
12a70 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
12a80 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
12a90 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
12aa0 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
12ab0 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
12ac0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12ae0 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
12af0 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
12b00 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
12b10 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
12b20 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  .    db->busyHan
12b30 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
12b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12b50 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
12b60 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
12b70 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
12b80 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
12b90 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  rc);.  }.  rc = 
12ba0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
12bb0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  b, rc);..  /* If
12bc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
12bd0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c  tive statements,
12be0 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72   clear the inter
12bf0 72 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69  rupt flag at thi
12c00 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a  s.  ** point.  *
12c10 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  /.  if( db->nVdb
12c20 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20  eActive==0 ){.  
12c30 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
12c40 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  rupted = 0;.  }.
12c50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12c60 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12c70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12c80 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
12c90 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
12ca0 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
12cb0 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
12cc0 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
12cd0 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
12ce0 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
12cf0 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
12d00 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12d10 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
12d20 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
12d30 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
12d40 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
12d50 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
12d60 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Db){.  /* EVIDEN
12d70 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32  CE-OF: R-41613-2
12d80 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33  0553 The sqlite3
12d90 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
12da0 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65  D,X) is equivale
12db0 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  nt to.  ** sqlit
12dc0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
12dd0 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f  t_v2(D,X,SQLITE_
12de0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
12df0 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65  VE,0,0). */.  re
12e00 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
12e10 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
12e20 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45  b,zDb,SQLITE_CHE
12e30 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
12e40 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  0,0);.}..#ifndef
12e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
12e60 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
12e70 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
12e80 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
12e90 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
12ea0 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
12eb0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
12ec0 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
12ed0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
12ee0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
12ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
12f00 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
12f10 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
12f20 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
12f30 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
12f40 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
12f50 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
12f60 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
12f70 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
12f80 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
12f90 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
12fa0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
12fb0 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
12fc0 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
12fd0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
12fe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
12ff0 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
13000 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
13010 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
13020 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
13030 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
13040 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
13050 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
13060 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
13070 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
13080 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
13090 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
130a0 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
130b0 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
130c0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
130d0 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
130e0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
130f0 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
13100 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
13110 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
13120 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
13130 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
13140 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
13150 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
13160 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
13170 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
13180 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
13190 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
131a0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
131b0 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41  IVE, FULL, RESTA
131c0 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54  RT.** or TRUNCAT
131d0 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
131e0 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
131f0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
13200 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
13210 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
13220 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
13230 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13250 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
13260 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13280 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
13290 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
132a0 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
132b0 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
132c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
132d0 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
132e0 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
132f0 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
13300 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13310 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
13320 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
13330 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
13340 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
13350 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
13360 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
13370 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
13380 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13390 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
133a0 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
133b0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
133c0 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
133d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
133e0 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
133f0 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
13400 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
13410 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
13420 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
13430 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
13440 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
13450 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
13460 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
13470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13480 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13490 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
134a0 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
134b0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
134c0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
134d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
134e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
134f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
13500 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
13510 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
13520 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
13530 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13540 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
13550 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
13560 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
13570 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
13580 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
13590 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
135a0 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
135b0 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
135c0 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
135d0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
135e0 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
135f0 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
13600 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
13610 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
13620 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
13630 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
13640 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
13650 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
13660 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
13670 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13680 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
13690 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
136a0 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
136b0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
136d0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
136e0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
13730 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
13740 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
13770 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
13780 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
13790 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
137a0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
137b0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
137c0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
137d0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
137e0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
137f0 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13800 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13810 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13820 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
13840 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
13850 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
13890 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
138c0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
138d0 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
13900 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
13910 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
13920 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
13930 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
13940 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
13950 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13960 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
13970 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
13980 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
13990 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
139a0 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
139b0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
139c0 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
139d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
139e0 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  E==3.  UNUSED_PA
139f0 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
13a00 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
13a10 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
13a20 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
13a30 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
13a40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13a50 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
13a60 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
13a70 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
13a80 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
13a90 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
13aa0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
13ab0 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
13ac0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
13ad0 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
13ae0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13b00 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
13b10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
13b20 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
13b30 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69  M_BKPT);.  }.  i
13b40 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
13b50 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13b60 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
13b70 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13b80 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
13b90 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
13ba0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13bb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
13bc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13bd0 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
13be0 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
13bf0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
13c00 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
13c10 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
13c20 20 29 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e   );.    z = db->
13c30 65 72 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a  errCode ? (char*
13c40 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
13c50 65 78 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20  ext(db->pErr) : 
13c60 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
13c70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13c80 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
13c90 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
13ca0 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
13cb0 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
13cc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
13cd0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13ce0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
13cf0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
13d00 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
13d10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
13d20 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
13d30 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
13d40 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
13d50 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
13d60 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
13d70 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
13d80 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
13d90 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
13da0 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
13db0 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
13dc0 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
13dd0 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
13de0 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
13df0 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
13e00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
13e10 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
13e20 0a 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27  .    'b', 'a', '
13e30 64 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61  d', ' ', 'p', 'a
13e40 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27  ', 'r', 'a', 'm'
13e50 2c 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c  , 'e', 't', 'e',
13e60 20 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27   'r', ' ',.    '
13e70 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f  o', 'r', ' ', 'o
13e80 27 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27  ', 't', 'h', 'e'
13e90 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c  , 'r', ' ', 'A',
13ea0 20 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a   'P', 'I', ' ',.
13eb0 20 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73      'm', 'i', 's
13ec0 27 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27  ', 'u', 's', 'e'
13ed0 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
13ee0 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
13ef0 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
13f00 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
13f10 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
13f20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
13f30 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
13f40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
13f50 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
13f60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13f70 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13f80 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
13f90 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
13fa0 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
13fb0 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
13fc0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
13fd0 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
13fe0 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
13ff0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
14000 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
14010 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64  g(db, db->errCod
14020 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  e, sqlite3ErrStr
14030 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a  (db->errCode));.
14040 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
14050 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
14060 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
14070 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
14080 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
14090 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
140a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
140b0 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
140c0 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
140d0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
140e0 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
140f0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
14100 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
14110 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
14120 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
14130 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
14140 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
14150 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
14160 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
14170 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
14180 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
14190 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
141a0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c      sqlite3OomCl
141b0 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ear(db);.  }.  s
141c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
141d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
141e0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
141f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14200 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
14210 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
14220 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
14230 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
14240 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
14250 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
14260 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
14270 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
14280 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
14290 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
142a0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
142b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
142c0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
142d0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
142e0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
142f0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
14300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14310 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
14320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
14330 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
14340 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
14350 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
14360 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
14370 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
14380 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
14390 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
143a0 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
143b0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
143c0 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
143d0 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
143e0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
143f0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
14400 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
14410 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
14420 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14440 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
14450 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
14460 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ode;.}.int sqlit
14470 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  e3_system_errno(
14480 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
14490 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e  return db ? db->
144a0 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d  iSysErrno : 0;.}
144b0 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e    ../*.** Return
144c0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
144d0 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
144e0 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
144f0 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
14500 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f  rgument.  For no
14510 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63  w, this simply c
14520 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61  alls the interna
14530 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  l sqlite3ErrStr(
14540 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ).** function..*
14550 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
14560 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74  lite3_errstr(int
14570 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   rc){.  return s
14580 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
14590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
145a0 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
145b0 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
145c0 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
145d0 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
145e0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
145f0 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
14600 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
14610 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
14620 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
14630 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
14640 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
14650 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
14660 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
14670 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
14680 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
14690 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
146a0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
146b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
146c0 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73  t enc2;.  .  ass
146d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
146e0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
146f0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
14700 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
14710 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
14720 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
14730 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
14740 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
14750 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
14760 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
14770 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
14780 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
14790 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
147a0 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
147b0 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
147c0 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
147d0 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
147e0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
147f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
14800 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
14810 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
14820 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
14830 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
14840 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
14850 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
14860 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
14870 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
14880 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
14890 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
148a0 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
148b0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
148c0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BKPT;.  }..  /
148d0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
148e0 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67  call is removing
148f0 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e   or replacing an
14900 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74   existing collat
14910 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ion .  ** sequen
14920 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74  ce. If so, and t
14930 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
14940 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79  VMs, return busy
14950 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  . If there.  ** 
14960 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
14970 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  s, invalidate an
14980 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  y pre-compiled s
14990 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
149a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
149b0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
149c0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
149d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
149e0 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
149f0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
14a00 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
14a10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14a20 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
14a30 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
14a40 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
14a50 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
14a60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
14a70 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
14a80 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
14a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14aa0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
14ab0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
14ac0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
14ad0 62 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  b, 0);..    /* I
14ae0 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
14af0 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
14b00 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
14b10 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
14b20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
14b30 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
14b40 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
14b50 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
14b60 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
14b70 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
14b80 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14b90 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
14ba0 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
14bb0 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
14bc0 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
14bd0 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
14be0 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
14bf0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
14c00 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
14c10 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
14c20 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
14c30 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
14c40 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
14c50 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
14c60 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
14c70 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b  CollSeq, zName);
14c80 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
14c90 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
14ca0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14cb0 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
14cc0 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
14cd0 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
14ce0 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
14cf0 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
14d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14d10 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
14d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14d30 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
14d40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14d60 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
14d70 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14d80 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
14d90 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
14da0 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
14db0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14dc0 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  T;.  pColl->xCmp
14dd0 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
14de0 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
14df0 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
14e00 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
14e10 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
14e20 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
14e30 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14e40 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
14e50 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
14e60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14e70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14e80 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
14e90 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
14ea0 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
14eb0 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
14ec0 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
14ed0 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
14ee0 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
14ef0 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
14f00 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
14f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
14f20 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
14f30 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
14f40 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
14f50 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14f60 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
14f70 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
14f80 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
14f90 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14fa0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
14fb0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
14fc0 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
14fd0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
14fe0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
14ff0 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
15000 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
15010 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
15020 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
15030 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
15040 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
15050 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
15060 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
15070 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
15080 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
15090 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
150a0 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
150b0 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
150c0 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
150d0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
150e0 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
150f0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
15100 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
15110 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
15120 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15130 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
15140 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
15150 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
15160 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
15170 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
15180 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
15190 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
151a0 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
151b0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
151c0 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
151d0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
151e0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
151f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15200 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
15210 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
15220 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
15230 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
15240 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
15250 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15260 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
15270 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15280 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
15290 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
152a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
152b0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
152c0 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
152d0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
152e0 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  27.# error SQLIT
152f0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
15300 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
15310 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e  en 0 and 127.#en
15320 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15330 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
15340 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
15350 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72  CHED>125.# error
15360 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
15370 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
15380 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23  ween 0 and 125.#
15390 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
153a0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
153b0 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
153c0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
153d0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
153e0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
153f0 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
15400 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
15410 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
15420 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
15430 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
15440 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
15450 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
15460 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
15470 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
15480 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
15490 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
154a0 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
154b0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
154c0 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49  HREADS<0 || SQLI
154d0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
154e0 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72  READS>50.# error
154f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
15500 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20  ER_THREADS must 
15510 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
15520 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   50.#endif.../*.
15530 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
15540 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
15550 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
15560 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
15570 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
15580 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
15590 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
155a0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
155b0 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
155c0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
155d0 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
155e0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
155f0 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
15600 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
15610 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
15620 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
15630 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
15640 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
15650 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
15660 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
15670 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
15680 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
15690 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
156a0 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
156b0 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
156c0 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  imit;..#ifdef SQ
156d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
156e0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
156f0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
15700 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
15710 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
15720 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
15730 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
15740 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
15750 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
15760 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
15770 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
15780 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
15790 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
157a0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
157b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
157c0 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
157d0 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
157e0 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
157f0 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
15800 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
15810 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
15820 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
15830 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
15840 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15850 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
15860 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
15870 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15880 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15890 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
158a0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
158b0 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
158c0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
158d0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
158e0 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
158f0 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
15900 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15910 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
15920 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
15930 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
15940 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15950 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15960 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
15970 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
15980 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
15990 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
159a0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
159b0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
159c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
159d0 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
159e0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
159f0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
15a00 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
15a10 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15a30 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15a40 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
15a50 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
15a60 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
15a70 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15a80 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
15a90 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
15aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
15ae0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
15af0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15b00 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15b10 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
15b20 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
15b30 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
15b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15b50 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15b60 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
15b70 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
15b80 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
15b90 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15ba0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15bb0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
15bc0 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57  S]==SQLITE_MAX_W
15bd0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b  ORKER_THREADS );
15be0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
15bf0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
15c00 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f  HREADS==(SQLITE_
15c10 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
15c20 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
15c30 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
15c40 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
15c50 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
15c60 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
15c70 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
15c80 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
15c90 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
15ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15cb0 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
15cc0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
15cd0 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
15ce0 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
15cf0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
15d00 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
15d10 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
15d20 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
15d30 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
15d40 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
15d50 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
15d60 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
15d90 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
15da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15db0 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
15dc0 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
15dd0 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
15de0 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
15df0 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
15e00 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
15e10 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
15e20 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
15e30 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
15e40 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
15e50 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
15e60 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
15e70 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
15e80 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
15e90 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
15ea0 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
15eb0 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
15ec0 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
15ed0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
15ee0 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
15ef0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
15f00 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
15f10 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
15f20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15f30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
15f40 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
15f50 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
15f60 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
15f70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15f80 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
15f90 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
15fa0 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
15fb0 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
15fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
15fd0 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
15fe0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
15ff0 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
16000 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
16010 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
16020 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
16030 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
16040 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
16050 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
16060 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
16070 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
16080 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16090 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
160a0 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
160b0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
160c0 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
160d0 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
160e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
160f0 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
16100 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
16110 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16120 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
16130 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
16140 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
16150 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
16160 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
16170 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
16180 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
16190 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
161a0 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
161b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
161c0 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
161d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
161e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
161f0 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
16200 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
16210 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
16220 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
16230 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
16240 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
16250 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16260 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
16270 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
16280 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
16290 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
162a0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
162b0 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
162c0 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
162d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
162e0 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
162f0 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
16300 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
16310 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
16320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16340 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
16350 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
16360 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
16370 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
16380 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
16390 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
163a0 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
163b0 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
163c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
163d0 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
163e0 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16400 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
16410 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
16420 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
16430 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
16440 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16450 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
16460 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
16470 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
16480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16490 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
164a0 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
164b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
164c0 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
164d0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
164e0 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
164f0 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
16500 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
16510 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
16520 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
16530 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16540 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20  OPEN_URI)       
16550 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
16560 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20  48725-32206 */. 
16570 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
16580 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16590 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49  g.bOpenUri) /* I
165a0 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34  MP: R-51689-4654
165b0 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e  8 */.   && nUri>
165c0 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
165d0 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
165e0 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38  0 /* IMP: R-5788
165f0 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a  4-37496 */.  ){.
16600 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
16610 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
16640 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
16650 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
16660 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
16680 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
16690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
166a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
166b0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
166c0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
166d0 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65  */.    u64 nByte
166e0 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
166f0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16700 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
16710 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
16720 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
16730 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
16740 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
16750 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
16760 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
16770 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
16780 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
16790 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
167a0 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
167b0 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
167c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
167d0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
167e0 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
167f0 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
16800 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
16810 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
16820 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
16830 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
16840 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
16850 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20  E_NOMEM_BKPT;.. 
16860 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64     iIn = 5;.#ifd
16870 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
16880 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
16890 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
168a0 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+5, "///", 3)=
168b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
168c0 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  = 7;.      /* Th
168d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
168e0 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49  ition causes URI
168f0 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64  s with five lead
16900 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16910 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66  .      ** like f
16920 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61  ile://///host/pa
16930 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  th to be convert
16940 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b  ed into UNCs lik
16950 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20  e //host/path.. 
16960 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72       ** The corr
16970 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74  ect URI for that
16980 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77   UNC has only tw
16990 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e  o or four leadin
169a0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
169b0 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68       ** file://h
169c0 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65  ost/path or file
169d0 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20  :////host/path. 
169e0 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73   But 5 leading s
169f0 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20  lashes is a .   
16a00 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72     ** common err
16a10 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c  or, we are told,
16a20 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74   so we handle it
16a30 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
16a40 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
16a50 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c   strncmp(zUri+7,
16a60 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
16a70 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65   iIn++; }.    }e
16a80 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
16a90 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c  zUri+5, "//local
16aa0 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29  host/", 12)==0 )
16ab0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36  {.      iIn = 16
16ac0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
16ad0 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
16ae0 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
16af0 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
16b00 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
16b10 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
16b20 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
16b30 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
16b40 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
16b50 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
16b60 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
16b70 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
16b80 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
16b90 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
16ba0 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
16bb0 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
16bc0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
16bd0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16be0 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
16bf0 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
16c00 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
16c10 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
16c20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16c30 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
16c40 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
16c50 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
16c60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
16c70 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
16c80 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
16c90 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
16ca0 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
16cb0 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
16cc0 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
16cd0 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
16ce0 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
16cf0 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
16d00 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
16d10 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
16d20 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
16d30 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
16d40 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
16d50 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
16d60 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
16d70 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
16d80 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
16d90 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
16da0 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
16db0 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
16dc0 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
16dd0 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
16de0 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
16df0 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
16e00 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
16e10 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
16e20 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
16e30 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
16e40 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
16e50 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
16e60 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
16e70 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
16e80 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
16e90 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
16ea0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
16eb0 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
16ec0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
16ed0 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
16ee0 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
16ef0 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
16f00 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
16f10 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
16f20 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
16f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
16f40 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
16f50 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
16f60 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23  f( octet==0 ){.#
16f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
16f80 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
16f90 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  R.          /* T
16fa0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
16fb0 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
16fc0 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
16fd0 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
16fe0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
16ff0 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
17000 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
17010 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
17020 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
17030 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
17040 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
17050 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
17060 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
17070 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
17080 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
17090 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
170a0 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
170b0 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
170c0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
170d0 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
170e0 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
170f0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
17100 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
17110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
17120 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
17130 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
17140 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
17150 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
17160 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
17170 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17180 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
17190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
171a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
171b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
171c0 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45   ENABLE_URI_00_E
171d0 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c  RROR is defined,
171e0 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20   "%00" in a URI 
171f0 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  is an error. */.
17200 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
17210 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17220 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65  rintf("unexpecte
17230 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b  d %%00 in uri");
17240 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17250 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17260 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
17270 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64  se_uri_out;.#end
17280 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
17290 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
172a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
172b0 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
172c0 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
172d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
172e0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
172f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
17300 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
17310 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
17320 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
17330 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
17340 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
17350 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
17360 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
17370 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
17380 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
17390 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
173a0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
173b0 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
173c0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
173d0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
173e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
173f0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
17400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
17410 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
17420 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
17430 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
17440 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
17450 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
17460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
17470 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
17480 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
17490 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
174a0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
174b0 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
174c0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
174d0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
174e0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
174f0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
17500 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
17510 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
17520 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
17530 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
17540 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
17550 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
17560 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
17570 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
17580 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
17590 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
175a0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
175b0 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
175c0 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
175d0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
175e0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
175f0 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
17600 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
17610 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
17620 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
17630 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
17640 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
17650 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
17660 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
17670 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
17680 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
17690 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
176a0 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
176b0 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
176c0 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
176d0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
176e0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
176f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17700 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
17710 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
17720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
17730 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
17740 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
17750 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
17760 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
17770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
17780 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
17790 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
177a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
177b0 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
177c0 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
177d0 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
177e0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
177f0 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
17800 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
17810 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
17820 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17830 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
17840 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
17850 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
17860 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
17870 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17880 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
17890 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
178a0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
178b0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
178c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
178d0 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
178e0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
178f0 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
17900 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
17910 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17920 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
17930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17940 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
17950 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
17960 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
17970 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
17980 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
17990 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
179a0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
179b0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
179c0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
179d0 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
179e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
179f0 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
17a00 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
17a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17a20 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
17a30 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
17a40 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
17a50 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
17a60 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
17a70 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
17a80 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
17a90 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
17aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17ab0 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
17ac0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ae0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17af0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
17b00 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
17b10 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
17b20 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
17b30 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
17b40 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
17b50 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
17b60 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
17b70 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
17b80 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
17b90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
17ba0 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
17bb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17bc0 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
17bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
17be0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
17bf0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
17c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
17c10 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
17c20 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
17c30 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
17c40 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
17c50 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
17c60 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
17c70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17c80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17ca0 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
17cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
17cc0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17cd0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
17ce0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
17cf0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
17d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
17d10 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
17d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
17d30 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
17d40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17d50 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
17d60 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
17d70 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
17d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
17d90 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17da0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
17db0 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
17dc0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
17df0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
17e00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17e10 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
17e20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
17e30 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
17e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17e50 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
17e60 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
17e70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
17e80 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
17e90 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
17ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
17eb0 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
17ec0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
17ed0 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
17ee0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
17ef0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
17f00 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  T;.    if( nUri 
17f10 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
17f20 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
17f30 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i);.    }.    zF
17f40 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
17f50 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
17f60 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
17f70 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
17f80 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
17f90 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
17fa0 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
17fb0 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
17fc0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
17fd0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17fe0 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
17ff0 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
18000 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18010 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
18020 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
18030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18050 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
18060 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
18070 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
18080 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
18090 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
180a0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
180b0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
180c0 29 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  )./*.** Process 
180d0 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 71 75 65  URI filename que
180e0 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 72 65  ry parameters re
180f0 6c 65 76 61 6e 74 20 74 6f 20 74 68 65 20 53 51  levant to the SQ
18100 4c 69 74 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a  Lite Encryption.
18110 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52  ** Extension.  R
18120 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
18130 79 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e  y of the relevan
18140 74 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  t query paramete
18150 72 73 20 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61  rs are.** seen a
18160 6e 64 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  nd return false 
18170 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  if not..*/.int s
18180 71 6c 69 74 65 33 43 6f 64 65 63 51 75 65 72 79  qlite3CodecQuery
18190 50 61 72 61 6d 65 74 65 72 73 28 0a 20 20 73 71  Parameters(.  sq
181a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
181b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
181c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
181d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
181e0 2c 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ,       /* Which
181f0 20 73 63 68 65 6d 61 20 69 73 20 62 65 69 6e 67   schema is being
18200 20 63 72 65 61 74 65 64 2f 61 74 74 61 63 68 65   created/attache
18210 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
18220 72 20 2a 7a 55 72 69 20 20 20 20 20 20 20 2f 2a  r *zUri       /*
18230 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f   URI filename */
18240 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
18250 20 2a 7a 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a   *zKey;.  if( (z
18260 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
18270 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69  i_parameter(zUri
18280 2c 20 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20  , "hexkey"))!=0 
18290 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20  && zKey[0] ){.  
182a0 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20    u8 iByte;.    
182b0 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
182c0 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20  zDecoded[40];.  
182d0 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
182e0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65  =0; i<sizeof(zDe
182f0 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69  coded)*2 && sqli
18300 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79  te3Isxdigit(zKey
18310 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [i]); i++){.    
18320 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65    iByte = (iByte
18330 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65  <<4) + sqlite3He
18340 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b  xToInt(zKey[i]);
18350 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29  .      if( (i&1)
18360 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69  !=0 ) zDecoded[i
18370 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20  /2] = iByte;.   
18380 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b   }.    sqlite3_k
18390 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
183a0 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20  Decoded, i/2);. 
183b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
183c0 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79 20 3d  else if( (zKey =
183d0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
183e0 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22 6b 65  ameter(zUri, "ke
183f0 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  y"))!=0 ){.    s
18400 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
18410 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c  , zDb, zKey, sql
18420 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65  ite3Strlen30(zKe
18430 79 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y));.    return 
18440 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  1;.  }else if( (
18450 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75  zKey = sqlite3_u
18460 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72  ri_parameter(zUr
18470 69 2c 20 22 74 65 78 74 6b 65 79 22 29 29 21 3d  i, "textkey"))!=
18480 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18490 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
184a0 20 7a 4b 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20   zKey, -1);.    
184b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
184c0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
184d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
184e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
184f0 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
18500 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
18510 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
18520 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
18530 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
18540 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
18550 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
18560 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
18570 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
18580 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
18590 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
185a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
185b0 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
185c0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
185d0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
185e0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
185f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
18600 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
18610 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
18620 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
18630 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
18640 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
18650 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
18660 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18670 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
18680 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
18690 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
186a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
186b0 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
186c0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
186d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18700 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
18710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18720 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
18730 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
18740 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
18750 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
18760 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
18770 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
18780 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
18790 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
187a0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
187b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
187c0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
187d0 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
187e0 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
187f0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18800 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
18810 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18820 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
18830 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
18840 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18850 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
18860 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18870 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
18880 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18890 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  rc;.#endif..  if
188a0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
188b0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
188c0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
188d0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
188e0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
188f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
18900 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
18910 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
18920 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
18930 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
18940 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
18950 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
18960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
18970 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
18980 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18990 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
189a0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
189b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
189c0 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
189d0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
189e0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
189f0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
18a00 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18a10 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
18a20 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
18a30 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
18a40 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
18a50 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
18a60 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
18a70 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
18a80 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
18a90 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
18aa0 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
18ab0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18ac0 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
18ad0 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
18ae0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
18af0 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
18b00 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
18b10 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
18b20 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
18b30 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
18b40 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
18b50 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
18b60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18b70 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
18b80 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
18b90 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
18ba0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
18bb0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
18bc0 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
18bd0 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
18be0 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
18bf0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
18c00 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
18c10 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
18c20 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
18c30 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18c40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
18c50 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
18c60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18c70 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18c90 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
18ca0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
18cb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
18cc0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18ce0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18cf0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
18d00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18d10 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
18d20 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
18d30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18d40 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18d60 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18d70 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
18d80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18d90 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18db0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
18dc0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
18dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18de0 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
18df0 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
18e00 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
18e10 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
18e20 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
18e30 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
18e40 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
18e50 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
18e60 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
18e70 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
18e80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18e90 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41  NABLE_MULTITHREA
18ea0 44 45 44 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c  DED_CHECKS.   ||
18eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a  nfig.bCoreMutex.
18ed0 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
18ee0 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
18ef0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
18f00 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
18f10 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
18f20 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
18f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
18f40 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
18f50 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
18f60 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
18f70 7d 0a 20 20 20 20 69 66 28 20 69 73 54 68 72 65  }.    if( isThre
18f80 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20  adsafe==0 ){.   
18f90 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 57     sqlite3MutexW
18fa0 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28  arnOnContention(
18fb0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
18fc0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
18fd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
18fe0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
18ff0 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
19000 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
19010 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
19020 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
19030 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
19040 62 53 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c  bStatic;.  db->l
19050 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
19060 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
19070 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
19080 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
19090 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
190a0 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
190b0 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
190c0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
190d0 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ;.  db->aLimit[S
190e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
190f0 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51  ER_THREADS] = SQ
19100 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52  LITE_DEFAULT_WOR
19110 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64  KER_THREADS;.  d
19120 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19130 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
19140 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
19150 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65  >szMmap = sqlite
19160 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
19170 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  Mmap;.  db->next
19180 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
19190 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
191a0 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b  ap = 0x7FFFFFFF;
191b0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
191c0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
191d0 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
191e0 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
191f0 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 7c 20 53 51 4c 49 54 45 5f 4e 6f 44 51 53 53   | SQLITE_NoDQSS
19220 63 68 65 6d 61 0a 23 69 66 20 21 64 65 66 69 6e  chema.#if !defin
19230 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
19240 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
19250 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  X) || SQLITE_DEF
19260 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
19270 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
19280 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
19290 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a  utoIndex.#endif.
192a0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
192b0 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43  LT_CKPTFULLFSYNC
192c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192d0 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46    | SQLITE_CkptF
192e0 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a  ullFSync.#endif.
192f0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
19300 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34  LT_FILE_FORMAT<4
19310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19320 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63    | SQLITE_Legac
19330 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a  yFileFmt.#endif.
19340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19350 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
19360 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
19370 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f       | SQLITE_Lo
19380 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64  adExtension.#end
19390 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
193a0 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f  FAULT_RECURSIVE_
193b0 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20  TRIGGERS.       
193c0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
193d0 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23  TE_RecTriggers.#
193e0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
193f0 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
19400 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26  _FOREIGN_KEYS) &
19410 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  & SQLITE_DEFAULT
19420 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20  _FOREIGN_KEYS.  
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19440 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
19450 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eys.#endif.#if d
19460 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45  efined(SQLITE_RE
19470 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f  VERSE_UNORDERED_
19480 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20  SELECTS).       
19490 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
194a0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a  TE_ReverseOrder.
194b0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
194c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
194d0 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
194e0 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  HECK).          
194f0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19500 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69  CellSizeCk.#endi
19510 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
19520 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
19530 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20  _TOKENIZER).    
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
19550 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69  QLITE_Fts3Tokeni
19560 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  zer.#endif.#if d
19570 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19580 41 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20  ABLE_QPSG).     
19590 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
195a0 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a  LITE_EnableQPSG.
195b0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
195c0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
195d0 54 5f 44 45 46 45 4e 53 49 56 45 29 0a 20 20 20  T_DEFENSIVE).   
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
195f0 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
19600 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
19610 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
19620 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
19630 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19640 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19650 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
19660 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
19670 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
19680 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
19690 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
196a0 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
196b0 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
196c0 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
196d0 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
196e0 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
196f0 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
19700 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
19710 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
19720 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
19730 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
19740 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
19750 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ailure..  **.  *
19760 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19770 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c  -52786-44878 SQL
19780 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65  ite defines thre
19790 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  e built-in colla
197a0 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ting.  ** functi
197b0 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ons:.  */.  crea
197c0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
197d0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
197e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
197f0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
19800 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
19810 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
19820 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
19830 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
19840 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
19850 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19860 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
19870 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
19880 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16LE, 0, binCol
19890 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
198a0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
198b0 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
198c0 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
198d0 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
198e0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
198f0 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
19900 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
19910 30 2c 20 72 74 72 69 6d 43 6f 6c 6c 46 75 6e 63  0, rtrimCollFunc
19920 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
19930 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
19940 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
19950 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56  out;.  }.  /* EV
19960 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33  IDENCE-OF: R-083
19970 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66  08-17224 The def
19980 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
19990 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a  unction for all.
199a0 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20    ** strings is 
199b0 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20  BINARY. .  */.  
199c0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
199d0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
199e0 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
199f0 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  F8, sqlite3StrBI
19a00 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65  NARY, 0);.  asse
19a10 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
19a20 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  l!=0 );..  /* Pa
19a30 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
19a40 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 0a 20 20  /URI argument.  
19a50 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c  **.  ** Only all
19a60 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62  ow sensible comb
19a70 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  inations of bits
19a80 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72   in the flags ar
19a90 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54  gument.  .  ** T
19aa0 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
19ab0 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63   any non-sense c
19ac0 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73  ombination is us
19ad0 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ed.  If we.  ** 
19ae0 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c  do not block ill
19af0 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  egal combination
19b00 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64  s here, it could
19b10 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73   trigger.  ** as
19b20 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
19b30 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65  s in deeper laye
19b40 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f  rs.  Sensible co
19b50 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  mbinations.  ** 
19b60 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  are:.  **.  **  
19b70 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1:  SQLITE_OPEN_
19b80 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32  READONLY.  **  2
19b90 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
19ba0 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36  EADWRITE.  **  6
19bb0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
19bc0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
19bd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20  E_OPEN_CREATE.  
19be0 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
19bf0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61 73  gs = flags;.  as
19c00 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
19c10 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
19c20 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
19c30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19c40 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
19c50 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
19c60 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
19c70 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
19c80 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
19c90 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
19ca0 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
19cb0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
19cc0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
19cd0 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
19ce0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
19cf0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
19d00 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
19d10 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
19d20 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
19d30 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
19d40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
19d50 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19d60 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34  ;  /* IMP: R-654
19d70 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 65  97-44594 */.  }e
19d80 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
19d90 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56  lite3ParseUri(zV
19da0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fs, zFilename, &
19db0 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73  flags, &db->pVfs
19dc0 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d  , &zOpen, &zErrM
19dd0 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  sg);.  }.  if( r
19de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19df0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19e00 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74  TE_NOMEM ) sqlit
19e10 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
19e20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19e30 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20  WithMsg(db, rc, 
19e40 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
19e50 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
19e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19e70 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
19e80 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
19e90 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
19ea0 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
19eb0 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
19ec0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
19ed0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
19ee0 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
19ef0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
19f20 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
19f30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
19f60 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
19f70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19f80 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
19f90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19fa0 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f  (db, rc);.    go
19fb0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19fc0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
19fd0 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30  eEnter(db->aDb[0
19fe0 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
19ff0 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
1a000 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
1a010 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
1a020 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  Bt);.  if( !db->
1a030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45  mallocFailed ) E
1a040 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f  NC(db) = SCHEMA_
1a050 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ENC(db);.  sqlit
1a060 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d  e3BtreeLeave(db-
1a070 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
1a080 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
1a090 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
1a0a0 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20  maGet(db, 0);.. 
1a0b0 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
1a0c0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
1a0d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1a0e0 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20  se is FULL; for 
1a0f0 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
1a100 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46 46  tabase it is OFF
1a110 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
1a120 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
1a130 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
1a140 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
1a150 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  SName = "main";.
1a160 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
1a170 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49  ety_level = SQLI
1a180 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
1a190 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e  RONOUS+1;.  db->
1a1a0 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[1].zDbSName 
1a1b0 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
1a1c0 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
1a1d0 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  vel = PAGER_SYNC
1a1e0 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20  HRONOUS_OFF;..  
1a1f0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1a200 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
1a210 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1a220 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1a230 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
1a240 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
1a250 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75   all built-in fu
1a260 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20  nctions, but do 
1a270 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
1a280 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ead the.  ** dat
1a290 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74  abase schema yet
1a2a0 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65  . This is delaye
1a2b0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  d until the firs
1a2c0 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
1a2d0 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65  ase.  ** is acce
1a2e0 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ssed..  */.  sql
1a2f0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
1a300 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
1a310 74 65 33 52 65 67 69 73 74 65 72 50 65 72 43 6f  te3RegisterPerCo
1a320 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46  nnectionBuiltinF
1a330 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20  unctions(db);.  
1a340 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
1a350 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64 65  code(db);..#ifde
1a360 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a370 46 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73 74  FTS5.  /* Regist
1a380 65 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20  er any built-in 
1a390 46 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f  FTS5 module befo
1a3a0 72 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 61  re loading the a
1a3b0 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78  utomatic.  ** ex
1a3c0 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 61  tensions. This a
1a3d0 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63 20  llows automatic 
1a3e0 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65  extensions to re
1a3f0 67 69 73 74 65 72 20 46 54 53 35 20 0a 20 20 2a  gister FTS5 .  *
1a400 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64  * tokenizers and
1a410 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
1a420 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ions.  */.  if( 
1a430 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a440 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a450 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1a460 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 64  qlite3Fts5Init(d
1a470 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a480 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
1a490 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
1a4a0 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
1a4b0 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
1a4c0 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
1a4d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
1a4e0 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
1a4f0 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69  () API..  */.  i
1a500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a510 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
1a520 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
1a530 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  s(db);.    rc = 
1a540 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1a550 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
1a560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a570 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
1a580 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
1a590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a5a0 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
1a5b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a5c0 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
1a5d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
1a5e0 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
1a5f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1a600 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
1a610 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a620 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1a630 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
1a640 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a660 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
1a670 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
1a680 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
1a690 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
1a6a0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1a6b0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a6c0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20  _ENABLE_FTS3 /* 
1a6d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
1a6e0 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  fined by SQLITE_
1a6f0 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20  ENABLE_FTS4 */. 
1a700 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a710 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1a720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a730 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
1a740 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a750 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1a760 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1a770 43 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  CU) || defined(S
1a780 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
1a790 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20 20 69  _COLLATIONS).  i
1a7a0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a7b0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a7c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1a7d0 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
1a7e0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a7f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a800 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
1a810 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a820 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a830 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1a840 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
1a850 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1a860 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a870 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
1a880 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TAB.  if( !db->m
1a890 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1a8a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
1a8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44     rc = sqlite3D
1a8c0 62 70 61 67 65 52 65 67 69 73 74 65 72 28 64 62  bpageRegister(db
1a8d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a8e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a8f0 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a  BLE_DBSTAT_VTAB.
1a900 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a910 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a920 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a930 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61  c = sqlite3Dbsta
1a940 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  tRegister(db);. 
1a950 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1a960 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a970 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d  JSON1.  if( !db-
1a980 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1a9a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a9b0 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a  3Json1Init(db);.
1a9c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a9d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a9e0 5f 53 54 4d 54 56 54 41 42 0a 20 20 69 66 28 20  _STMTVTAB.  if( 
1a9f0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1aa00 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1aa10 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
1aa20 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e 69  lite3StmtVtabIni
1aa30 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1aa40 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  f..  /* -DSQLITE
1aa50 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1aa60 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
1aa70 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
1aa80 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
1aa90 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
1aaa0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1aab0 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
1aac0 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
1aad0 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
1aae0 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
1aaf0 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
1ab00 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
1ab10 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
1ab20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1ab30 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
1ab40 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
1ab50 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
1ab60 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
1ab70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1ab80 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
1ab90 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
1aba0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1abd0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1abe0 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
1abf0 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
1ac00 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
1ac10 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
1ac20 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
1ac30 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
1ac40 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
1ac50 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
1ac60 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
1ac70 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1aca0 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
1acb0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
1acc0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
1acd0 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
1ace0 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
1acf0 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
1ad00 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  ut:.  if( db ){.
1ad10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1ad20 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
1ad30 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20  readsafe==0.    
1ad40 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1ad50 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
1ad60 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
1ad70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ad80 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1ad90 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1ada0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
1adb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
1adc0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
1add0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20  _NOMEM );.  if( 
1ade0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1adf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1ae00 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
1ae10 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
1ae20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ae30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1ae40 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1ae50 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
1ae60 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20  Db = db;.#ifdef 
1ae70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1ae80 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
1ae90 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1aea0 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
1aeb0 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61   Opening a db ha
1aec0 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
1aed0 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
1aee0 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20   0. */.    void 
1aef0 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47  *pArg = sqlite3G
1af00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
1af10 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  logArg;.    sqli
1af20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1af30 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62  xSqllog(pArg, db
1af40 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  , zFilename, 0);
1af50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
1af60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1af70 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20  AS_CODEC).  if( 
1af80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
1af90 73 71 6c 69 74 65 33 43 6f 64 65 63 51 75 65 72  sqlite3CodecQuer
1afa0 79 50 61 72 61 6d 65 74 65 72 73 28 64 62 2c 20  yParameters(db, 
1afb0 30 2c 20 7a 4f 70 65 6e 29 3b 0a 23 65 6e 64 69  0, zOpen);.#endi
1afc0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
1afd0 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72  (zOpen);.  retur
1afe0 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a  n rc & 0xff;.}..
1aff0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
1b000 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
1b010 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b020 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
1b030 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1b040 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
1b050 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
1b060 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
1b070 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b0a0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1b0b0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1b0c0 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1b0d0 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
1b0e0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
1b0f0 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
1b100 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
1b110 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
1b120 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
1b130 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
1b140 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
1b150 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1b160 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
1b170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b180 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
1b190 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
1b1a0 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
1b1b0 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
1b1c0 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
1b1d0 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  Db, (unsigned in
1b1e0 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  t)flags, zVfs);.
1b1f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b200 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1b210 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
1b220 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
1b230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
1b240 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
1b250 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
1b260 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1b270 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
1b280 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
1b290 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
1b2a0 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
1b2b0 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
1b2c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1b2d0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
1b2e0 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
1b2f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1b300 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d  MOR.  if( ppDb==
1b310 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b320 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1b330 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20  endif.  *ppDb = 
1b340 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
1b350 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
1b360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
1b370 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
1b380 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1b390 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
1b3a0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a  zFilename==0 ) z
1b3b0 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30  Filename = "\000
1b3c0 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20  \000";.  pVal = 
1b3d0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
1b3e0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
1b3f0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
1b400 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51  1, zFilename, SQ
1b410 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1b420 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1b430 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d  ;.  zFilename8 =
1b440 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1b450 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
1b460 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  TF8);.  if( zFil
1b470 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  ename8 ){.    rc
1b480 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28   = openDatabase(
1b490 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62  zFilename8, ppDb
1b4a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b4b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b4c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1b4d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1b4e0 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  TE, 0);.    asse
1b4f0 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d  rt( *ppDb || rc=
1b500 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
1b510 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b520 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73  ITE_OK && !DbHas
1b530 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20  Property(*ppDb, 
1b540 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
1b550 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48  ed) ){.      SCH
1b560 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d  EMA_ENC(*ppDb) =
1b570 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
1b580 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1b590 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b5a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b5b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
1b5c0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
1b5d0 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
1b5e0 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
1b5f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1b600 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1b610 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
1b620 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
1b630 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
1b640 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1b650 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
1b660 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1b670 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
1b680 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
1b690 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
1b6a0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
1b6b0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
1b6c0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
1b6d0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
1b6e0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
1b6f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b700 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1b710 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d  tion_v2(db, zNam
1b720 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
1b730 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f  ompare, 0);.}../
1b740 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1b750 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
1b760 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
1b770 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1b780 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
1b790 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1b7a0 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
1b7b0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
1b7c0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
1b7d0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
1b7e0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
1b7f0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
1b800 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
1b810 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
1b820 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
1b830 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
1b840 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
1b850 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b860 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b870 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b880 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
1b890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b8a0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b8b0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b8c0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b8d0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
1b8e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b8f0 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
1b900 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1b910 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
1b920 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
1b930 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
1b940 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
1b950 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1b960 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1b970 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1b980 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1b990 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b9a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1b9b0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
1b9c0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
1b9d0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1b9e0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
1b9f0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
1ba00 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
1ba10 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
1ba20 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
1ba30 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
1ba40 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
1ba50 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
1ba60 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
1ba70 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
1ba80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ba90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
1baa0 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66  *zName8;..#ifdef
1bab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1bac0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1bad0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1bae0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
1baf0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
1bb00 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1bb10 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1bb20 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1bb30 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
1bb40 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
1bb50 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
1bb60 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
1bb70 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
1bb80 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
1bb90 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
1bba0 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
1bbb0 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
1bbc0 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
1bbd0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
1bbe0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
1bbf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bc00 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
1bc10 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
1bc20 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
1bc30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bc40 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1bc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1bc60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1bc70 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
1bc80 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1bc90 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1bca0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1bcb0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1bcc0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1bcd0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1bce0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1bcf0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1bd00 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1bd10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1bd20 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
1bd30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1bd40 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
1bd50 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
1bd60 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
1bd70 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
1bd80 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
1bd90 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65   char*).){.#ifde
1bda0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bdb0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1bdc0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1bdd0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1bde0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1bdf0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1be00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1be10 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1be20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1be30 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b  d = xCollNeeded;
1be40 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1be50 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ed16 = 0;.  db->
1be60 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
1be70 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
1be80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1be90 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1bea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1beb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1bec0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1bed0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
1bee0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
1bef0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
1bf00 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
1bf10 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1bf20 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
1bf30 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
1bf40 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
1bf50 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1bf60 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
1bf70 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
1bf80 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74  eeded16(.  sqlit
1bf90 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
1bfa0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
1bfb0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
1bfc0 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73  eeded16)(void*,s
1bfd0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1bfe0 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  tRep,const void*
1bff0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1c000 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1c010 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1c020 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1c030 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1c040 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1c050 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1c060 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c070 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1c080 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
1c090 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1c0a0 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
1c0b0 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
1c0c0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
1c0d0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
1c0e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1c0f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1c100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c110 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
1c120 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1c130 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1c140 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1c150 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
1c160 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
1c170 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
1c180 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
1c190 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
1c1a0 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
1c1b0 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
1c1c0 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
1c1d0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
1c1e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c1f0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
1c200 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
1c210 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1c220 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
1c230 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1c240 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
1c250 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1c260 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
1c270 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
1c280 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
1c290 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
1c2a0 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
1c2b0 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
1c2c0 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
1c2d0 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
1c2e0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
1c2f0 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
1c300 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
1c310 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
1c320 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1c330 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1c340 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
1c350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c360 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c370 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1c380 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1c390 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1c3a0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1c3b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c3c0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1c3d0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
1c3e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1c3f0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1c400 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73   are substitutes
1c410 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
1c420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
1c430 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
1c440 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1c450 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  , SQLITE_NOMEM a
1c460 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
1c470 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
1c480 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
1c490 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  e two purposes:.
1c4a0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
1c4b0 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
1c4c0 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
1c4d0 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
1c4e0 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
1c4f0 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
1c500 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
1c510 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
1c520 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
1c530 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
1c540 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
1c550 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
1c560 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
1c570 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
1c580 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
1c590 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
1c5a0 6e 74 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  nt sqlite3Report
1c5b0 45 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20  Error(int iErr, 
1c5c0 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73  int lineno, cons
1c5d0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a  t char *zType){.
1c5e0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45    sqlite3_log(iE
1c5f0 72 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20  rr, "%s at line 
1c600 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1c620 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b  ype, lineno, 20+
1c630 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
1c640 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45  ());.  return iE
1c650 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rr;.}.int sqlite
1c660 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
1c670 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1c680 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1c690 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1c6a0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1c6b0 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1c6c0 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  r(SQLITE_CORRUPT
1c6d0 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62  , lineno, "datab
1c6e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29  ase corruption")
1c6f0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  ;.}.int sqlite3M
1c700 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c  isuseError(int l
1c710 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1c720 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1c730 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1c740 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1c750 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1c760 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69  QLITE_MISUSE, li
1c770 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b  neno, "misuse");
1c780 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61  .}.int sqlite3Ca
1c790 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20  ntopenError(int 
1c7a0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1c7b0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1c7c0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1c7d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1c7e0 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1c7f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1c800 20 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74   lineno, "cannot
1c810 20 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a   open file");.}.
1c820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c830 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  BUG.int sqlite3C
1c840 6f 72 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28  orruptPgnoError(
1c850 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f  int lineno, Pgno
1c860 20 70 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a   pgno){.  char z
1c870 4d 73 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  Msg[100];.  sqli
1c880 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1c890 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c  eof(zMsg), zMsg,
1c8a0 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
1c8b0 70 74 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ption page %d", 
1c8c0 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
1c8d0 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1c8e0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1c8f0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1c900 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1c910 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1c920 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69  neno, zMsg);.}.i
1c930 6e 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45  nt sqlite3NomemE
1c940 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1c950 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1c960 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c970 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1c980 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1c990 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1c9a0 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22  NOMEM, lineno, "
1c9b0 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  OOM");.}.int sql
1c9c0 69 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72  ite3IoerrnomemEr
1c9d0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1c9e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1c9f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ca00 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ca10 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1ca20 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  rtError(SQLITE_I
1ca30 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65  OERR_NOMEM, line
1ca40 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72  no, "I/O OOM err
1ca50 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  or");.}.#endif..
1ca60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ca70 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1ca80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
1ca90 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
1caa0 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
1cab0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
1cac0 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
1cad0 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
1cae0 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
1caf0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
1cb00 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
1cb10 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
1cb20 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
1cb30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
1cb40 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
1cb50 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
1cb60 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
1cb70 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
1cb80 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
1cb90 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
1cba0 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
1cbb0 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
1cbc0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1cbd0 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
1cbe0 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
1cbf0 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
1cc00 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
1cc10 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
1cc20 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
1cc30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
1cc40 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
1cc50 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
1cc60 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1cc70 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1cc80 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
1cc90 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1cca0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1ccb0 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
1ccc0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1ccd0 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
1cce0 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
1ccf0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1cd00 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
1cd10 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
1cd20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1cd30 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
1cd40 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
1cd50 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
1cd60 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1cd70 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
1cd80 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
1cd90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1cda0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
1cdb0 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
1cdc0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1cdd0 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
1cde0 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
1cdf0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
1ce00 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
1ce10 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1ce20 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
1ce30 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
1ce40 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1ce60 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
1ce70 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
1ce80 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1ce90 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1cea0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
1ceb0 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
1cec0 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
1ced0 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b  .  int iCol = 0;
1cee0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1cef0 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
1cf00 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1cf10 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
1cf20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
1cf30 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
1cf40 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
1cf50 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53   = 0;...#ifdef S
1cf60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1cf70 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1cf80 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1cf90 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65  Ok(db) || zTable
1cfa0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Name==0 ){.    r
1cfb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1cfc0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
1cfd0 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  ndif..  /* Ensur
1cfe0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1cff0 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c  chema has been l
1d000 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  oaded */.  sqlit
1d010 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1d020 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
1d030 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
1d040 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
1d050 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
1d060 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53  ErrMsg);.  if( S
1d070 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1d080 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1d090 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ut;.  }..  /* Lo
1d0a0 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
1d0b0 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20  n question */.  
1d0c0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1d0d0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
1d0e0 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  leName, zDbName)
1d0f0 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c  ;.  if( !pTab ||
1d100 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1d110 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
1d120 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1d130 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ut;.  }..  /* Fi
1d140 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f  nd the column fo
1d150 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20  r which info is 
1d160 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69  requested */.  i
1d170 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d  f( zColumnName==
1d180 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72  0 ){.    /* Quer
1d190 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20  y for existance 
1d1a0 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f  of table only */
1d1b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1d1c0 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
1d1d0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
1d1e0 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
1d1f0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1d200 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
1d210 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1d220 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
1d230 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1d240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d260 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
1d270 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
1d280 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1d290 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
1d2a0 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b  (zColumnName) ){
1d2b0 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  .        iCol = 
1d2c0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1d2d0 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c       pCol = iCol
1d2e0 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f  >=0 ? &pTab->aCo
1d2f0 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20  l[iCol] : 0;.   
1d300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d310 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1d320 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1d330 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1d340 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
1d350 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
1d360 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
1d370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
1d380 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1d390 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
1d3a0 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
1d3b0 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
1d3c0 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
1d3d0 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
1d3e0 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
1d3f0 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
1d400 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1d410 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
1d420 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
1d430 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
1d440 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
1d450 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
1d460 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
1d470 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
1d480 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
1d490 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
1d4a0 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
1d4b0 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
1d4c0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
1d4d0 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
1d4e0 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
1d4f0 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
1d500 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1d510 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
1d520 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1d530 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
1d540 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
1d550 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1d560 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
1d570 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20  pe(pCol,0);.    
1d580 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
1d590 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
1d5a0 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
1d5b0 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
1d5c0 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
1d5d0 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
1d5e0 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
1d5f0 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
1d600 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
1d610 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1d620 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
1d630 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
1d640 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
1d650 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
1d660 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
1d670 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
1d680 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
1d690 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65  CollSeq = sqlite
1d6a0 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a  3StrBINARY;.  }.
1d6b0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
1d6c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
1d6d0 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
1d6e0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
1d6f0 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
1d700 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
1d710 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
1d720 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
1d730 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
1d740 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
1d750 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
1d760 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
1d770 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
1d780 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
1d790 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
1d7a0 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
1d7b0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
1d7c0 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
1d7d0 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
1d7e0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
1d7f0 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
1d800 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
1d810 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
1d820 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
1d830 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
1d840 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
1d850 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
1d860 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
1d870 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
1d880 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
1d890 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
1d8a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1d8b0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1d8c0 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
1d8d0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1d8e0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
1d8f0 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
1d900 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
1d910 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
1d920 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
1d930 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1d940 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
1d950 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45  hMsg(db, rc, (zE
1d960 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
1d970 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1d980 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1d990 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
1d9a0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1d9b0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1d9c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1d9d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1d9e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c   rc;.}../*.** Sl
1d9f0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
1da00 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
1da10 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
1da20 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
1da30 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
1da40 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
1da50 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
1da60 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
1da70 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1da80 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
1da90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
1daa0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
1dab0 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
1dac0 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
1dad0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
1dae0 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
1daf0 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
1db00 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
1db10 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
1db20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
1db30 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
1db40 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
1db50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
1db60 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1db70 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
1db80 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
1db90 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
1dba0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
1dbb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1dbc0 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20   onoff){.#ifdef 
1dbd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1dbe0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1dbf0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1dc00 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1dc10 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1dc20 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1dc30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1dc40 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1dc50 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
1dc60 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
1dc70 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
1dc80 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1dc90 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1dca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dcb0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1dcc0 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
1dcd0 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
1dce0 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
1dcf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1dd00 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
1dd10 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1dd20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
1dd30 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1dd40 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1dd50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42  QLITE_ERROR;.  B
1dd60 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23  tree *pBtree;..#
1dd70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1dd80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1dd90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1dda0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1ddb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1ddc0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1ddd0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1dde0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1ddf0 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
1de00 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1de10 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1de20 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1de30 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
1de40 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
1de50 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
1de60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1de70 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
1de80 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
1de90 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
1dea0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1deb0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
1dec0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1ded0 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1dee0 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
1def0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
1df00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
1df10 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1df20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1df30 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
1df40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1df50 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1df60 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1df70 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29  TL_VFS_POINTER )
1df80 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1df90 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73  3_vfs**)pArg = s
1dfa0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
1dfb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1dfc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dfd0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1dfe0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55  SQLITE_FCNTL_JOU
1dff0 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  RNAL_POINTER ){.
1e000 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1e010 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71  file**)pArg = sq
1e020 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69  lite3PagerJrnlFi
1e030 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
1e040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1e050 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e060 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1e070 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e 20 29 7b  _DATA_VERSION ){
1e080 0a 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65  .      *(unsigne
1e090 64 20 69 6e 74 2a 29 70 41 72 67 20 3d 20 73 71  d int*)pArg = sq
1e0a0 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
1e0b0 72 73 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  rsion(pPager);. 
1e0c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e0d0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1e0e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e0f0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
1e100 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
1e110 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e120 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1e130 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1e140 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1e150 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1e160 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e170 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
1e180 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
1e190 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
1e1a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
1e1b0 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
1e1c0 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  rc = 0;.#ifdef S
1e1d0 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
1e1e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e1f0 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20  TER(op);.#else. 
1e200 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
1e210 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
1e220 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1e230 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e240 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1e250 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1e260 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
1e270 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e280 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
1e290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1e2a0 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
1e2b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e2c0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1e2d0 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
1e2e0 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
1e2f0 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
1e300 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
1e310 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
1e320 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
1e330 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1e340 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
1e350 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
1e360 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
1e370 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
1e380 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e390 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
1e3a0 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
1e3b0 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
1e3c0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1e3d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e3e0 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
1e3f0 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
1e400 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
1e410 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
1e420 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
1e430 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
1e440 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
1e450 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
1e460 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
1e470 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
1e480 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
1e490 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
1e4a0 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
1e4b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e4c0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
1e4d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e4e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
1e4f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e500 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1e510 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1e520 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
1e530 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
1e540 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
1e550 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
1e560 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
1e570 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
1e580 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
1e590 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
1e5a0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
1e5b0 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
1e5c0 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
1e5d0 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
1e5e0 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
1e5f0 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
1e600 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
1e610 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
1e620 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
1e630 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
1e640 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
1e650 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1e660 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
1e670 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e680 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
1e690 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
1e6a0 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
1e6b0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e6c0 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
1e6d0 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
1e6e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e6f0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1e700 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
1e710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e720 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1e730 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e740 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53  ontrol(FAULT_INS
1e750 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29  TALL, xCallback)
1e760 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1e770 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65  rrange to invoke
1e780 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65   xCallback() whe
1e790 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75  never sqlite3Fau
1e7a0 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65  ltSim() is calle
1e7b0 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61  d,.    ** if xCa
1e7c0 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55  llback is not NU
1e7d0 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  LL..    **.    *
1e7e0 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74  * As a test of t
1e7f0 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74  he fault simulat
1e800 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73  or mechanism its
1e810 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c  elf, sqlite3Faul
1e820 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69  tSim(0).    ** i
1e830 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61  s called immedia
1e840 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61  tely after insta
1e850 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61  lling the new ca
1e860 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72  llback and the r
1e870 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c  eturn.    ** val
1e880 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46  ue from sqlite3F
1e890 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d  aultSim(0) becom
1e8a0 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  es the return fr
1e8b0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
1e8c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
1e8d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e8e0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e8f0 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a  L_FAULT_INSTALL:
1e900 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
1e910 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
1e920 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
1e930 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
1e940 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
1e950 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
1e960 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
1e970 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
1e980 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1e990 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1e9a0 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69  arg(ap, int(*)(i
1e9b0 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  nt));.      */. 
1e9c0 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
1e9d0 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55  (*TESTCALLBACKFU
1e9e0 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20  NC_t)(int);.    
1e9f0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ea00 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1ea10 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1ea20 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e   TESTCALLBACKFUN
1ea30 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  C_t);.      rc =
1ea40 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1ea50 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (0);.      break
1ea60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1ea70 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1ea80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
1ea90 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1eaa0 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
1eab0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1eac0 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
1ead0 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
1eae0 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
1eaf0 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
1eb00 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
1eb10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1eb20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
1eb30 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1eb40 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
1eb50 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
1eb60 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
1eb70 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1eb80 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
1eb90 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
1eba0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
1ebb0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
1ebc0 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
1ebd0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
1ebe0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
1ebf0 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
1ec00 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1ec10 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
1ec20 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
1ec30 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
1ec40 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
1ec50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ec60 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1ec70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ec80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ec90 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
1eca0 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
1ecb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1ecc0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1ecd0 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
1ece0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
1ecf0 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
1ed00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
1ed10 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
1ed20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1ed30 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
1ed40 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
1ed50 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
1ed60 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1ed70 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1ed80 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
1ed90 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1eda0 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
1edb0 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
1edc0 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
1edd0 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
1ede0 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
1edf0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1ee00 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
1ee10 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
1ee20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ee30 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
1ee40 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
1ee50 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69  .    ** deleteri
1ee60 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
1ee70 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ee80 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1ee90 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
1eea0 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
1eeb0 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
1eec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
1eed0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
1eee0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
1eef0 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
1ef00 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
1ef10 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
1ef20 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
1ef30 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
1ef40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ef50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef60 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1ef70 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1ef80 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ef90 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
1efa0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1efb0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1efc0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1efd0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1efe0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1eff0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1f000 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
1f010 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
1f020 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
1f030 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
1f040 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1f050 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f060 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
1f070 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
1f080 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
1f090 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1f0a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f0b0 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
1f0c0 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
1f0d0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
1f0e0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1f0f0 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
1f100 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
1f110 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
1f120 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
1f130 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
1f140 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1f150 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
1f160 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
1f170 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1f180 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1f190 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
1f1a0 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
1f1b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f1c0 2f 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f  /*side-effects-o
1f1d0 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28  k*/ (x = va_arg(
1f1e0 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
1f1f0 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
1f200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f210 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f220 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f230 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f240 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
1f250 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1f260 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1f270 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1f280 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
1f290 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
1f2a0 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
1f2b0 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
1f2c0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1f2d0 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
1f2e0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1f2f0 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 20  ue is ALWAYS(X) 
1f300 69 66 20 58 20 69 73 20 74 72 75 65 2c 20 6f 72  if X is true, or
1f310 20 30 20 69 66 20 58 20 69 73 20 66 61 6c 73 65   0 if X is false
1f320 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f330 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
1f340 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49  test is X==2.  I
1f350 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1f360 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65  ue is 2, that me
1f370 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59  ans.    ** ALWAY
1f380 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1f390 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70  are both no-op p
1f3a0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1f3b0 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  os, which is the
1f3c0 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
1f3d0 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65  setting.  If the
1f3e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f3f0 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28   1, then ALWAYS(
1f400 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20  ) is either.    
1f410 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  ** hard-coded to
1f420 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74   true or else it
1f430 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20   asserts if its 
1f440 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
1f450 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
1f460 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61  rst behavior (ha
1f470 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1f480 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
1f490 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
1f4a0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
1f4b0 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
1f4c0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  () is disabled a
1f4d0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  nd the second.  
1f4e0 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61    ** behavior (a
1f4f0 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67  ssert if the arg
1f500 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28  ument to ALWAYS(
1f510 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74  ) is false) is t
1f520 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1f530 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1f540 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1f550 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1f560 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a  enabled..    **.
1f570 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74      ** The run-t
1f580 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  ime test procedu
1f590 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f  re might look so
1f5a0 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
1f5b0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1f5c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1f5d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f5e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1f5f0 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20  AYS, 2)==2 ){.  
1f600 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1f610 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1f620 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73  ) are no-op pass
1f630 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a  -through macros.
1f640 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20      **    }else 
1f650 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1f660 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f670 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
1f680 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20   1) ){.    **   
1f690 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1f6a0 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69  asserts that x i
1f6b0 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29  s true. NEVER(x)
1f6c0 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61   asserts x is fa
1f6d0 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  lse..    **    }
1f6e0 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20  else{.    **    
1f6f0 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69    // ALWAYS(x) i
1f700 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20  s a constant 1. 
1f710 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63   NEVER(x) is a c
1f720 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a  onstant 0..    *
1f730 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  *    }.    */.  
1f740 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1f750 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b  STCTRL_ALWAYS: {
1f760 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1f770 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f780 20 20 20 20 20 72 63 20 3d 20 78 20 3f 20 41 4c       rc = x ? AL
1f790 57 41 59 53 28 78 29 20 3a 20 30 3b 0a 20 20 20  WAYS(x) : 0;.   
1f7a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f7b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1f7c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f7d0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f7e0 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1f7f0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1f800 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1f810 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1f820 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1f830 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1f840 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1f850 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1f860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f870 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1f880 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1f890 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1f8a0 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1f8b0 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1f8c0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1f8d0 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1f8e0 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1f8f0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1f900 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1f910 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1f920 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1f930 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1f940 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1f950 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1f960 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f970 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1f980 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f990 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1f9a0 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1f9b0 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1f9c0 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1f9d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f9e0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1f9f0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fa00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1fa10 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1fa20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1fa30 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1fa40 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1fa50 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1fa60 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1fa70 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1fa80 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1fa90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1faa0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1fab0 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1fac0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fad0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1fae0 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1faf0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1fb00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1fb10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1fb20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1fb30 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1fb40 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1fb50 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1fb60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1fb70 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1fb80 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1fb90 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1fba0 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1fbb0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1fbc0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1fbd0 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1fbe0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1fbf0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1fc00 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1fc10 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1fc20 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1fc30 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1fc40 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1fc50 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1fc60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1fc70 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1fc80 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1fc90 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1fca0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1fcb0 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1fcc0 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1fcd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1fce0 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1fcf0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1fd00 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1fd10 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1fd20 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1fd30 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1fd40 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1fd50 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1fd60 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1fd70 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1fd80 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1fd90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1fda0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1fdb0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1fdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1fdd0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1fde0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1fdf0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1fe00 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1fe10 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1fe20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1fe40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1fe50 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1fe60 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1fe70 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1fe80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1fe90 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1fea0 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  f is non-zero, s
1feb0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1fec0 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 0a 20  to localtime(). 
1fed0 20 20 20 2a 2a 20 61 6e 64 20 69 74 73 20 76 61     ** and its va
1fee0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
1fef0 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 20 75  onoff is zero, u
1ff00 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67  ndo this setting
1ff10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ff20 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ff30 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1ff40 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1ff50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1ff60 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d  LocaltimeFault =
1ff70 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1ff80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ff90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1ffa0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ffb0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ffc0 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e  TRL_INTERNAL_FUN
1ffd0 43 53 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  CS, int onoff);.
1ffe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1fff0 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
20000 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e   is non-zero, in
20010 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20  ternal-use-only 
20020 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  SQL functions.  
20030 20 20 2a 2a 20 61 72 65 20 76 69 73 69 62 6c 65    ** are visible
20040 20 74 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c   to ordinary SQL
20050 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
20060 6c 20 66 6f 72 20 74 65 73 74 69 6e 67 20 62 75  l for testing bu
20070 74 20 69 73 0a 20 20 20 20 2a 2a 20 75 6e 73 61  t is.    ** unsa
20080 66 65 20 62 65 63 61 75 73 65 20 69 6e 76 61 6c  fe because inval
20090 69 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  id parameters to
200a0 20 74 68 6f 73 65 20 69 6e 74 65 72 6e 61 6c 2d   those internal-
200b0 75 73 65 2d 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  use-only functio
200c0 6e 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 72 65  ns.    ** can re
200d0 73 75 6c 74 20 69 6e 20 63 72 61 73 68 65 73 20  sult in crashes 
200e0 6f 72 20 73 65 67 66 61 75 6c 74 73 2e 0a 20 20  or segfaults..  
200f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20100 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e  LITE_TESTCTRL_IN
20110 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53  TERNAL_FUNCTIONS
20120 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20130 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 49  3GlobalConfig.bI
20140 6e 74 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e 73  nternalFunctions
20150 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
20160 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20180 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
20190 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
201a0 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
201b0 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a  UPT, int);.    *
201c0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20  *.    ** Set or 
201d0 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61  clear a flag tha
201e0 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
201f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20200 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c  le is always wel
20210 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64  l-.    ** formed
20220 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75   and never corru
20230 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69  pt.  This flag i
20240 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75  s clear by defau
20250 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lt, indicating t
20260 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  hat.    ** datab
20270 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
20280 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63  have arbitrary c
20290 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74  orruption.  Sett
202a0 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72  ing the flag dur
202b0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69  ing.    ** testi
202c0 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69  ng causes certai
202d0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
202e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64  ments in the cod
202f0 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65  e to be activate
20300 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  d.    ** that de
20310 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61  monstrat invaria
20320 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d  nts on well-form
20330 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
20340 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
20350 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
20360 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
20370 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20380 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65  3GlobalConfig.ne
20390 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f  verCorrupt = va_
203a0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
203b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
203c0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
203d0 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68   threshold at wh
203e0 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e  ich OP_Once coun
203f0 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20  ters reset back 
20400 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20  to zero..    ** 
20410 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20  By default this 
20420 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f  is 0x7ffffffe (o
20430 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20  ver 2 billion), 
20440 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69  but that value i
20450 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67  s.    ** too big
20460 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65   to test in a re
20470 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20  asonable amount 
20480 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73  of time, so this
20490 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20   control is.    
204a0 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73  ** provided to s
204b0 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65  et a small and e
204c0 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20  asily reachable 
204d0 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20  reset value..   
204e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
204f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43  ITE_TESTCTRL_ONC
20500 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c  E_RESET_THRESHOL
20510 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
20520 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20530 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f  OnceResetThresho
20540 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ld = va_arg(ap, 
20550 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
20560 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20570 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
20580 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20590 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
205a0 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b  ERAGE, xCallback
205b0 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20  , ptr);.    **. 
205c0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44     ** Set the VD
205d0 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
205e0 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f  back function to
205f0 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20   xCallback with 
20600 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20  context .    ** 
20610 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20  pointer ptr..   
20620 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20630 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
20640 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69  E_COVERAGE: {.#i
20650 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
20660 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
20670 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62  typedef void (*b
20680 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28  ranch_callback)(
20690 76 6f 69 64 2a 2c 75 6e 73 69 67 6e 65 64 20 69  void*,unsigned i
206a0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
206d0 65 64 20 63 68 61 72 2c 75 6e 73 69 67 6e 65 64  ed char,unsigned
206e0 20 63 68 61 72 29 3b 0a 20 20 20 20 20 20 73 71   char);.      sq
206f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20700 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20  g.xVdbeBranch = 
20710 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68  va_arg(ap,branch
20720 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  _callback);.    
20730 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
20740 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63  onfig.pVdbeBranc
20750 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  hArg = va_arg(ap
20760 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
20770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20780 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
20790 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
207a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
207b0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
207c0 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20  b, nMax); */.   
207d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
207e0 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
207f0 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
20800 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
20810 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
20820 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72       db->nMaxSor
20830 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67  terMmap = va_arg
20840 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
20850 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20860 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
20870 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20880 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
20890 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  NIT);.    **.   
208a0 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
208b0 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68  E_OK if SQLite h
208c0 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
208d0 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45  zed and SQLITE_E
208e0 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e  RROR if.    ** n
208f0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ot..    */.    c
20900 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
20910 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20  TRL_ISINIT: {.  
20920 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20930 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
20940 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  it==0 ) rc = SQL
20950 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
20960 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20970 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
20980 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
20990 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
209a0 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65  STER, db, dbName
209b0 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
209c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
209d0 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
209e0 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
209f0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
20a00 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f  s.  "db" is a po
20a10 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
20a20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
20a30 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65  nection.  dbName
20a40 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
20a50 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e   name (ex: "main
20a60 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d  " or.    ** "tem
20a70 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72  p") which will r
20a80 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73  eceive the impos
20a90 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75  ter.  "onOff" tu
20aa0 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  rns imposter mod
20ab0 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f  e on.    ** or o
20ac0 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74  ff.  "tnum" is t
20ad0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
20ae0 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68  the b-tree to wh
20af0 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ich the imposter
20b00 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  .    ** table sh
20b10 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  ould connect..  
20b20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
20b30 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  le imposter mode
20b40 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
20b50 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64  chema has alread
20b60 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20  y been parsed.  
20b70 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20  Then.    ** run 
20b80 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20  a single CREATE 
20b90 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
20ba0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
20bb0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
20bc0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  in.    ** the pa
20bd0 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68  rsed schema.  Th
20be0 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72  en turn imposter
20bf0 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61   mode back off a
20c00 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  gain..    **.   
20c10 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20   ** If onOff==0 
20c20 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20  and tnum>0 then 
20c30 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  reset the schema
20c40 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
20c50 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20  es, causing.    
20c60 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
20c70 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65   be reparsed the
20c80 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
20c90 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68   needed.  This h
20ca0 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66  as the.    ** ef
20cb0 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20  fect of erasing 
20cc0 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62  all imposter tab
20cd0 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
20ce0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
20cf0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
20d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
20d10 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
20d20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
20d30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
20d40 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
20d50 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
20d60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
20d70 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61  dDbName(db, va_a
20d80 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72  rg(ap,const char
20d90 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  *));.      db->i
20da0 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69  nit.busy = db->i
20db0 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
20dc0 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  e = va_arg(ap,in
20dd0 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  t);.      db->in
20de0 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f  it.newTnum = va_
20df0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
20e00 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
20e10 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69  busy==0 && db->i
20e20 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b  nit.newTnum>0 ){
20e30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20e40 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
20e50 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
20e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20e70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
20e80 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
20e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20ea0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 59  }..#if defined(Y
20eb0 59 43 4f 56 45 52 41 47 45 29 0a 20 20 20 20 2f  YCOVERAGE).    /
20ec0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
20ed0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20ee0 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43  ESTCTRL_PARSER_C
20ef0 4f 56 45 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f  OVERAGE, FILE *o
20f00 75 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut).    **.    *
20f10 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74  * This test cont
20f20 72 6f 6c 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61  rol (only availa
20f30 62 6c 65 20 77 68 65 6e 20 53 51 4c 69 74 65 20  ble when SQLite 
20f40 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
20f50 0a 20 20 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45  .    ** -DYYCOVE
20f60 52 41 47 45 29 20 77 72 69 74 65 73 20 61 20 72  RAGE) writes a r
20f70 65 70 6f 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22  eport onto "out"
20f80 20 74 68 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a   that shows all.
20f90 20 20 20 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f      ** state/loo
20fa0 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69  kahead combinati
20fb0 6f 6e 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ons in the parse
20fc0 72 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a  r state machine.
20fd0 20 20 20 20 2a 2a 20 77 68 69 63 68 20 61 72 65      ** which are
20fe0 20 6e 65 76 65 72 20 65 78 65 72 63 69 73 65 64   never exercised
20ff0 2e 20 20 49 66 20 61 6e 79 20 73 74 61 74 65 20  .  If any state 
21000 69 73 20 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20  is missed, make 
21010 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
21020 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 45 52  n code SQLITE_ER
21030 52 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ROR..    */.    
21040 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
21050 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45  CTRL_PARSER_COVE
21060 52 41 47 45 3a 20 7b 0a 20 20 20 20 20 20 46 49  RAGE: {.      FI
21070 4c 45 20 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67  LE *out = va_arg
21080 28 61 70 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20  (ap, FILE*);.   
21090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
210a0 72 73 65 72 43 6f 76 65 72 61 67 65 28 6f 75 74  rserCoverage(out
210b0 29 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ) ) rc = SQLITE_
210c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
210d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
210e0 20 2f 2a 20 64 65 66 69 6e 65 64 28 59 59 43 4f   /* defined(YYCO
210f0 56 45 52 41 47 45 29 20 2a 2f 0a 0a 20 20 20 20  VERAGE) */..    
21100 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
21110 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
21120 54 45 53 54 43 54 52 4c 5f 52 45 53 55 4c 54 5f  TESTCTRL_RESULT_
21130 49 4e 54 52 45 41 4c 2c 20 73 71 6c 69 74 65 33  INTREAL, sqlite3
21140 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20  _context*);.    
21150 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
21160 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 63 61 75 73  est-control caus
21170 65 73 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  es the most rece
21180 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  nt sqlite3_resul
21190 74 5f 69 6e 74 36 34 28 29 20 76 61 6c 75 65 0a  t_int64() value.
211a0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 74      ** to be int
211b0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 4d 45  erpreted as a ME
211c0 4d 5f 49 6e 74 52 65 61 6c 20 69 6e 73 74 65 61  M_IntReal instea
211d0 64 20 6f 66 20 61 73 20 61 6e 20 4d 45 4d 5f 49  d of as an MEM_I
211e0 6e 74 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c 0a 20  nt.  Normally,. 
211f0 20 20 20 2a 2a 20 4d 45 4d 5f 49 6e 74 52 65 61     ** MEM_IntRea
21200 6c 20 76 61 6c 75 65 73 20 6f 6e 6c 79 20 61 72  l values only ar
21210 69 73 65 20 64 75 72 69 6e 67 20 61 6e 20 49 4e  ise during an IN
21220 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 20 6f  SERT operation o
21230 66 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  f integer.    **
21240 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 61 20 52   values into a R
21250 45 41 4c 20 63 6f 6c 75 6d 6e 2c 20 73 6f 20 74  EAL column, so t
21260 68 65 79 20 63 61 6e 20 62 65 20 63 68 61 6c 6c  hey can be chall
21270 65 6e 67 69 6e 67 20 74 6f 20 74 65 73 74 2e 20  enging to test. 
21280 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 74 65 73   This.    ** tes
21290 74 2d 63 6f 6e 74 72 6f 6c 20 65 6e 61 62 6c 65  t-control enable
212a0 73 20 75 73 20 74 6f 20 77 72 69 74 65 20 61 6e  s us to write an
212b0 20 69 6e 74 72 65 61 6c 28 29 20 53 51 4c 20 66   intreal() SQL f
212c0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  unction that can
212d0 0a 20 20 20 20 2a 2a 20 69 6e 6a 65 63 74 20 61  .    ** inject a
212e0 6e 20 69 6e 74 72 65 61 6c 28 29 20 76 61 6c 75  n intreal() valu
212f0 65 20 61 74 20 61 72 62 69 74 72 61 72 79 20 70  e at arbitrary p
21300 6c 61 63 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  laces in an SQL 
21310 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 20 20 2a  statement,.    *
21320 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  * for testing pu
21330 72 70 6f 73 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  rposes..    */. 
21340 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21350 45 53 54 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49  ESTCTRL_RESULT_I
21360 4e 54 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  NTREAL: {.      
21370 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
21380 2a 70 43 74 78 20 3d 20 76 61 5f 61 72 67 28 61  *pCtx = va_arg(a
21390 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p, sqlite3_conte
213a0 78 74 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xt*);.      sqli
213b0 74 65 33 52 65 73 75 6c 74 49 6e 74 52 65 61 6c  te3ResultIntReal
213c0 28 70 43 74 78 29 3b 0a 20 20 20 20 20 20 62 72  (pCtx);.      br
213d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
213e0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
213f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e  dif /* SQLITE_UN
21400 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65  TESTABLE */.  re
21410 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21420 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
21430 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
21440 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
21450 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
21460 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
21470 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
21480 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
21490 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
214a0 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
214b0 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
214c0 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
214d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
214e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
214f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
21500 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
21510 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
21520 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
21530 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
21540 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
21550 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
21560 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
21570 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
21580 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
21590 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
215a0 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
215b0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
215c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
215d0 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
215e0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
215f0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
21600 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
21610 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
21620 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
21630 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
21640 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
21650 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
21660 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
21670 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
21680 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20  *zParam){.  if( 
21690 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
216a0 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75  zParam==0 ) retu
216b0 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
216c0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
216d0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
216e0 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
216f0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
21700 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
21710 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
21720 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
21730 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
21740 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
21750 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
21760 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
21770 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
21780 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
21790 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
217a0 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
217b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
217c0 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
217d0 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
217e0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
217f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
21800 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
21810 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
21820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
21830 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
21840 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21850 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
21860 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
21870 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
21880 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
21890 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
218a0 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
218b0 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
218c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
218d0 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
218e0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
218f0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
21900 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
21910 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
21920 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
21930 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
21940 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
21950 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
21960 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21970 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
21980 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
21990 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
219a0 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
219b0 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
219c0 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
219d0 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
219e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
219f0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
21a00 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
21a10 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
21a20 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
21a30 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44  f( z && sqlite3D
21a40 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
21a50 26 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44  &v)==0 ){.    bD
21a60 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
21a70 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
21a80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21a90 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
21aa0 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
21ab0 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
21ac0 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
21ad0 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
21ae0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
21af0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
21b00 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
21b10 29 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a  ){.  int iDb = z
21b20 44 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33  DbName ? sqlite3
21b30 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
21b40 44 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72  DbName) : 0;.  r
21b50 65 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20  eturn iDb<0 ? 0 
21b60 3a 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  : db->aDb[iDb].p
21b70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  Bt;.}../*.** Ret
21b80 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  urn the filename
21b90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21ba0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21bb0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
21bc0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f  onnection..*/.co
21bd0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
21be0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71  3_db_filename(sq
21bf0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
21c00 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
21c10 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
21c20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21c30 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
21c40 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
21c50 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
21c60 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
21c70 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
21c80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
21c90 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
21ca0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
21cb0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
21cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
21cd0 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ? sqlite3BtreeGe
21ce0 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a  tFilename(pBt) :
21cf0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
21d00 75 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73  urn 1 if databas
21d10 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f  e is read-only o
21d20 72 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74  r 0 if read/writ
21d30 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
21d40 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61  .** no such data
21d50 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  base exists..*/.
21d60 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
21d70 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20  eadonly(sqlite3 
21d80 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
21d90 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
21da0 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
21db0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
21dc0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
21dd0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
21de0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
21df0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
21e00 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
21e10 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
21e20 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
21e30 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
21e40 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
21e50 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
21e60 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
21e70 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d  nly(pBt) : -1;.}
21e80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
21e90 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
21ea0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73  /*.** Obtain a s
21eb0 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66  napshot handle f
21ec0 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  or the snapshot 
21ed0 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20  of database zDb 
21ee0 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65  currently .** be
21ef0 69 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64  ing read by hand
21f00 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
21f10 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
21f20 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  et(.  sqlite3 *d
21f30 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
21f40 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33   *zDb,.  sqlite3
21f50 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e  _snapshot **ppSn
21f60 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20  apshot.){.  int 
21f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
21f80 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  R;.#ifndef SQLIT
21f90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64  E_OMIT_WAL..#ifd
21fa0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21fb0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
21fc0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
21fd0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
21fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ff0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
22000 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
22010 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
22020 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28  ->mutex);..  if(
22030 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
22040 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
22050 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
22060 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
22070 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
22080 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
22090 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
220a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
220b0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
220c0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
220d0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
220e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
220f0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
22100 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
22110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22140 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73  gerSnapshotGet(s
22150 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
22160 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f  (pBt), ppSnapsho
22170 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
22180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22190 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
221a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
221b0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
221c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
221d0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
221e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  ../*.** Open a r
221f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
22200 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  on the snapshot 
22210 69 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53  idendified by pS
22220 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20  napshot..*/.int 
22230 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22240 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  _open(.  sqlite3
22250 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
22260 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c  har *zDb, .  sql
22270 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
22280 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e  Snapshot.){.  in
22290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
222a0 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
222b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69  ITE_OMIT_WAL..#i
222c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
222d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
222e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
222f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
22300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22310 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
22320 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
22330 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
22340 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
22350 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
22360 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
22370 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  Db;.    iDb = sq
22380 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
22390 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
223a0 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
223b0 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  1 ){.      Btree
223c0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
223d0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
223e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
223f0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d  IsInTrans(pBt)==
22400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 50 61 67  0 ){.        Pag
22410 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
22420 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
22430 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Bt);.        int
22440 20 62 55 6e 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   bUnlock = 0;.  
22450 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22460 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
22470 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
22480 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56        if( db->nV
22490 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a  dbeActive==0 ){.
224a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
224b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
224c0 70 73 68 6f 74 43 68 65 63 6b 28 70 50 61 67 65  pshotCheck(pPage
224d0 72 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  r, pSnapshot);. 
224e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
224f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 55                bU
22510 6e 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nlock = 1;.     
22520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22530 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
22540 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20  (pBt);.         
22550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22560 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22570 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22590 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
225a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
225c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
225d0 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c  shotOpen(pPager,
225e0 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20   pSnapshot);.   
225f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22620 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
22630 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
22640 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
22650 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
22660 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c  shotOpen(pPager,
22670 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
22680 20 20 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f         if( bUnlo
22690 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
226a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
226b0 73 68 6f 74 55 6e 6c 6f 63 6b 28 70 50 61 67 65  shotUnlock(pPage
226c0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
226d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
226e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
226f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
22700 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
22710 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
22720 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
22730 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20  ../*.** Recover 
22740 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74  as many snapshot
22750 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  s as possible fr
22760 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
22770 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
22780 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f 66  ** schema zDb of
22790 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f   database db..*/
227a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
227b0 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73 71  pshot_recover(sq
227c0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
227d0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69   char *zDb){.  i
227e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
227f0 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b  RROR;.  int iDb;
22800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22810 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
22820 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
22830 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
22840 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
22850 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
22860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
22870 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
22880 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
22890 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
228a0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20 3d  >mutex);.  iDb =
228b0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
228c0 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69  me(db, zDb);.  i
228d0 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
228e0 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20  >1 ){.    Btree 
228f0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
22900 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  Db].pBt;.    if(
22910 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   0==sqlite3Btree
22920 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42  IsInReadTrans(pB
22930 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22940 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
22950 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20  inTrans(pBt, 0, 
22960 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
22970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22990 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
229a0 52 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42  Recover(sqlite3B
229b0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
229c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
229d0 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
229e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
229f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
22a00 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
22a10 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
22a20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
22a30 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
22a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22a50 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c  a snapshot handl
22a60 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
22a70 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22a80 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  _get()..*/.void 
22a90 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22aa0 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e  _free(sqlite3_sn
22ab0 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
22ac0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t){.  sqlite3_fr
22ad0 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d  ee(pSnapshot);.}
22ae0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22af0 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
22b00 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
22b10 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
22b20 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a  EOPTION_DIAGS./*
22b30 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
22b40 6d 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d  me of a compile-
22b50 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74  time option, ret
22b60 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 61 74  urn true if that
22b70 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75   option.** was u
22b80 73 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66  sed and false if
22b90 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   not..**.** The 
22ba0 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61  name can optiona
22bb0 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20 22  lly begin with "
22bc0 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74 68 65  SQLITE_" but the
22bd0 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65 66 69   "SQLITE_" prefi
22be0 78 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  x.** is not requ
22bf0 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74 63 68  ired for a match
22c00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22c10 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
22c20 73 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sed(const char *
22c30 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  zOptName){.  int
22c40 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70   i, n;.  int nOp
22c50 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
22c60 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a  **azCompileOpt;.
22c70 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
22c80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
22c90 69 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20  if( zOptName==0 
22ca0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
22cb0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
22cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
22cd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43   }.#endif..  azC
22ce0 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69  ompileOpt = sqli
22cf0 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  te3CompileOption
22d00 73 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28  s(&nOpt);..  if(
22d10 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
22d20 28 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49  (zOptName, "SQLI
22d30 54 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f  TE_", 7)==0 ) zO
22d40 70 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e  ptName += 7;.  n
22d50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
22d60 33 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20  30(zOptName);.. 
22d70 20 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74 20 69   /* Since nOpt i
22d80 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69  s normally in si
22d90 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 61 20 6c  ngle digits, a l
22da0 69 6e 65 61 72 20 73 65 61 72 63 68 20 69 73 20  inear search is 
22db0 0a 20 20 2a 2a 20 61 64 65 71 75 61 74 65 2e 20  .  ** adequate. 
22dc0 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  No need for a bi
22dd0 6e 61 72 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a  nary search. */.
22de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
22df0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
22e00 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
22e10 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d  (zOptName, azCom
22e20 70 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d  pileOpt[i], n)==
22e30 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
22e40 33 49 73 49 64 43 68 61 72 28 28 75 6e 73 69 67  3IsIdChar((unsig
22e50 6e 65 64 20 63 68 61 72 29 61 7a 43 6f 6d 70 69  ned char)azCompi
22e60 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a  leOpt[i][n])==0.
22e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
22e80 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22e90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22ea0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22eb0 20 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69   N-th compile-ti
22ec0 6d 65 20 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67  me option string
22ed0 2e 20 20 49 66 20 4e 20 69 73 20 6f 75 74 20 6f  .  If N is out o
22ee0 66 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75  f range,.** retu
22ef0 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  rn a NULL pointe
22f00 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
22f10 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c   *sqlite3_compil
22f20 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20  eoption_get(int 
22f30 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a  N){.  int nOpt;.
22f40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
22f50 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61  zCompileOpt;.  a
22f60 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71  zCompileOpt = sq
22f70 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69  lite3CompileOpti
22f80 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66  ons(&nOpt);.  if
22f90 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74  ( N>=0 && N<nOpt
22fa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
22fb0 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a  zCompileOpt[N];.
22fc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22fd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22fe0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
22ff0 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a     PTION_DIAGS */.