/ Hex Artifact Content
Login

Artifact 9fdceee82066bd21512f1216b53d96fe77770177a18056d3b1bd136a0f348bf2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75  ES */..    defau
5de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5df0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5e20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5e40: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5e50: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5e60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e70: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5e80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5e90: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5ea0: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5eb0: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5ec0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5ed0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5f00: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5f10: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5f20: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5f30: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5f40: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5f50: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5f60: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5f70: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5f80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5fa0: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5fb0: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5fc0: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5fd0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5fe0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6000: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
6010: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
6020: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
6030: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
6040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6050: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
6060: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
6070: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
6080: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
6090: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
60b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
60c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
60d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
60e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
60f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
6100: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
6110: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
6120: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6130: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6140: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6150: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6160: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6180: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6190: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
61a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
61b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
61c0: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
61d0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
61e0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
61f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
6200: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
6210: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
6220: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6230: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6240: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6250: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6260: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6270: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6280: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6290: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
62a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
62b0: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
62c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
62e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
62f0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
6300: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
6310: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
6320: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6330: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6340: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6350: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6360: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6370: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6380: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6390: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
63a0: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
63b0: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
63c0: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
63d0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
6400: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
6410: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
6420: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6430: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6440: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6450: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6460: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6470: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6480: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6490: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
64a0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
64b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
64c0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
64d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
64e0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
64f0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
6500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6510: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
6520: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6530: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6540: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6550: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6560: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6570: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6580: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6590: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
65a0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
65b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
65c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
65d0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
65e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
65f0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6600: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
6610: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
6620: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6630: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6640: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6650: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6660: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6670: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
66a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
66b0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
66c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
66d0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
66e0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
66f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6710: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6720: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6730: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6740: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6750: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6780: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6790: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
67a0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
67b0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
67c0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
67d0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6810: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6830: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6850: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6870: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6890: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
68a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
68e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
68f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6900: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6910: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6920: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6940: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6950: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6970: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
69c0: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
69d0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
69e0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
69f0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6a00: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6a10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6a20: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6a30: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6a40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a50: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6a60: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6a80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6a90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6aa0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6ab0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6ac0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6ad0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6ae0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6af0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6b00: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6b10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6b40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6b50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6b60: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6b70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6b80: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6b90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6ba0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6bb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6bc0: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6bd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6bf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6c00: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6c10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6c20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6c30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6c40: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6c60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6c70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6c90: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ca0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6cc0: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6cd0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6ce0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6cf0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6d00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6d20: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6d30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6d40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6d50: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6d60: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6d70: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6d80: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6da0: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6db0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6dc0: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6dd0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6de0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6e30: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6e40: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6e50: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6e60: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6e70: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6e80: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6e90: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6ea0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6eb0: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6ec0: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6ed0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6ee0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6ef0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6f00: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6f10: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6f20: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6f30: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6f60: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6f80: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6f90: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6fa0: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6fb0: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6fc0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6fd0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6fe0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ff0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
7000: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7010: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
7020: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
7030: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
7040: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7050: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7060: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
7070: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
7080: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
7090: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
70a0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
70b0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
70c0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
70d0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
70e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
70f0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7100: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7110: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7120: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7130: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7140: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7150: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7160: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7170: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7180: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7190: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71a0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
71b0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
71c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
71d0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
71e0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
71f0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7200: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7210: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7220: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7230: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7240: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  se  },.      };.
7250: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
7260: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
7270: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
7280: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
7290: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
72a0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
72b0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
72c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
72d0: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
72e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
72f0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
7300: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
7310: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
7320: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
7330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  );.          u32
7340: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
7350: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
7360: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7380: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
7390: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
73a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
73b0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
73c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
73d0: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
73e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
73f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
7400: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
7410: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
7420: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
7430: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7440: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
7450: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7460: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
7470: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
7480: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
7490: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
74a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
74b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
74c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
74d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
74e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
74f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
7500: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7510: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7520: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7530: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
7540: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
7550: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
7560: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
7570: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
7580: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
7590: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
75a0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
75b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
75c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
75d0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
75e0: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
75f0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
7600: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
7610: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
7620: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
7630: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
7640: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
7650: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
7660: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
7670: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
7680: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
7690: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
76a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
76b0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
76c0: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
76d0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
76e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
76f0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7700: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
7720: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
7730: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
7740: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
7750: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
7760: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
7770: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
7780: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
7790: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
77a0: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
77b0: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
77c0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
77d0: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
77e0: 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  y. */.  assert( 
77f0: 70 4b 65 79 31 20 26 26 20 70 4b 65 79 32 20 29  pKey1 && pKey2 )
7800: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
7810: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
7820: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
7830: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
7840: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7850: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
7860: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
7870: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
7880: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
7890: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
78a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
78b0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d  NCE-OF: R-31624-
78c0: 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c  24737 RTRIM is l
78d0: 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70  ike BINARY excep
78e0: 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20  t that extra.   
78f0: 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20     ** spaces at 
7900: 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65  the end of eithe
7910: 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20  r string do not 
7920: 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c  change the resul
7930: 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20  t. In other.    
7940: 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69    ** words, stri
7950: 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65  ngs will compare
7960: 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e   equal to one an
7970: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
7980: 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64   they.      ** d
7990: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68  iffer only in th
79a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63  e number of spac
79b0: 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20  es at the end.. 
79c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
79d0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
79e0: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
79f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7a00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
7a10: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7a20: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7a30: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7a40: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7a50: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7a60: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7a70: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7a80: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7a90: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7aa0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7ab0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7ac0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7ad0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7ae0: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7af0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7b00: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7b10: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7b20: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7b30: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7b40: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7b50: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7b60: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7b70: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7b80: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7b90: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7ba0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7bb0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7bc0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7bd0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7be0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7bf0: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7c00: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7c10: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7c20: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7c30: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7c40: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7c50: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7c60: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7c70: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7c80: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7c90: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7ca0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7cb0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7cc0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7cd0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7ce0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7cf0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7d00: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7d10: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7d20: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7d30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7d40: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7d50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7d60: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7d70: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  id;.}../*.** Set
7d80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7d90: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ned by the sqlit
7da0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7db0: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
7dc0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7dd0: 69 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e  ite3_set_last_in
7de0: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
7df0: 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f  e3 *db, sqlite3_
7e00: 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23  int64 iRowid){.#
7e10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7e20: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
7e30: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
7e40: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
7e50: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
7e60: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7e70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
7e80: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
7e90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7ea0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61  mutex);.  db->la
7eb0: 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
7ec0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7ed0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
7ee0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
7ef0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7f00: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
7f10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
7f20: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
7f30: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
7f40: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
7f50: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7f60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7f70: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7f80: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7f90: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7fa0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7fb0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7fc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7fe0: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
7ff0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8000: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
8010: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
8020: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
8030: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8040: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
8050: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
8060: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8070: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
8080: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
8090: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
80a0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
80b0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
80c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
80d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
80e0: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
80f0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
8100: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
8110: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
8120: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
8130: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
8140: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8150: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
8160: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
8170: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
8180: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
8190: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
81a0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
81b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
81c0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
81d0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
81e0: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
81f0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
8200: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
8210: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
8220: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
8230: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
8240: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8250: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
8260: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
8270: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
8280: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
8290: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
82a0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
82b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
82c0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
82d0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
82e0: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
82f0: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
8300: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
8310: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
8320: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
8330: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
8340: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
8350: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
8360: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
8370: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
8380: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
8390: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
83a0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
83b0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
83c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
83d0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
83e0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
83f0: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
8400: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
8410: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
8420: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
8430: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8440: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8450: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8460: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
8470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
8480: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
8490: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
84a0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
84b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
84c0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
84d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
84e0: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
84f0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
8500: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
8510: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
8520: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
8530: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
8540: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
8550: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
8560: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8570: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
8580: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
8590: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
85a0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
85b0: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
85c0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
85d0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
85e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
85f0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
8600: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8610: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
8620: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  ema;.    if( db-
8630: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20  >aDb[i].pSchema 
8640: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  ){.      for(p=s
8650: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8660: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8670: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
8680: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
8690: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
86a0: 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74  = (Table *)sqlit
86b0: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
86c0: 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
86d0: 75 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69  ual(pTab) ) sqli
86e0: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
86f0: 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  t(db, pTab);.   
8700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8710: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
8720: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
8730: 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ule); p; p=sqlit
8740: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
8750: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
8760: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
8770: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
8780: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70     if( pMod->pEp
8790: 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  oTab ){.      sq
87a0: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
87b0: 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45  ect(db, pMod->pE
87c0: 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  poTab);.    }.  
87d0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
87e0: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
87f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
8800: 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65  veAll(db);.#else
8810: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8820: 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  TER(db);.#endif.
8830: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8840: 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65  TRUE if database
8850: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
8860: 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  as unfinalized p
8870: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8880: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8890: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
88a0: 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f  up objects.  .*/
88b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e  .static int conn
88c0: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c  ectionIsBusy(sql
88d0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
88e0: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   j;.  assert( sq
88f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8900: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
8910: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
8920: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
8930: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
8940: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
8950: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8960: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
8970: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8980: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
8990: 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  t) ) return 1;. 
89a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
89b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
89c0: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
89d0: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
89e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43  tic int sqlite3C
89f0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
8a00: 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69  , int forceZombi
8a10: 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  e){.  if( !db ){
8a20: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
8a30: 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37  -OF: R-63257-117
8a40: 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  40 Calling sqlit
8a50: 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20  e3_close() or.  
8a60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f    ** sqlite3_clo
8a70: 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e  se_v2() with a N
8a80: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75  ULL pointer argu
8a90: 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65  ment is a harmle
8aa0: 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20  ss no-op. */.   
8ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ac0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  K;.  }.  if( !sq
8ad0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8ae0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
8af0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8b00: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8b10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
8b20: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8b30: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
8b40: 54 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54  Trace & SQLITE_T
8b50: 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20  RACE_CLOSE ){.  
8b60: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
8b70: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c  ITE_TRACE_CLOSE,
8b80: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20   db->pTraceArg, 
8b90: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
8ba0: 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e  * Force xDisconn
8bb0: 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c  ect calls on all
8bc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
8bd0: 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41  */.  disconnectA
8be0: 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f  llVtab(db);..  /
8bf0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
8c00: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20  on is open, the 
8c10: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
8c20: 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20  b() call above. 
8c30: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76   ** will not hav
8c40: 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69  e called the xDi
8c50: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
8c60: 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c  d on any virtual
8c70: 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  .  ** tables in 
8c80: 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
8c90: 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c  ] array. The fol
8ca0: 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74  lowing sqlite3Vt
8cb0: 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a  abRollback().  *
8cc0: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73  * call will do s
8cd0: 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  o. We need to do
8ce0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65   this before the
8cf0: 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76   check for activ
8d00: 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
8d10: 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20  ments below, as 
8d20: 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c  the v-table impl
8d30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62  ementation may b
8d40: 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73  e storing.  ** s
8d50: 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ome prepared sta
8d60: 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c  tements internal
8d70: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ly..  */.  sqlit
8d80: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
8d90: 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79  b);..  /* Legacy
8da0: 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74   behavior (sqlit
8db0: 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76  e3_close() behav
8dc0: 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72  ior) is to retur
8dd0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55  n.  ** SQLITE_BU
8de0: 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  SY if the connec
8df0: 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20  tion can not be 
8e00: 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65  closed immediate
8e10: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ly..  */.  if( !
8e20: 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63  forceZombie && c
8e30: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8e40: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
8e50: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
8e60: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
8e70: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
8e80: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69   due to unfinali
8e90: 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74  zed ".       "st
8ea0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8eb0: 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29  nished backups")
8ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
8ed0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
8ee0: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
8ef0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8f00: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8f10: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
8f20: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
8f30: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8f40: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69   ){.    /* Closi
8f50: 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46  ng the handle. F
8f60: 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
8f70: 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61  is passed the va
8f80: 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71  lue 2. */.    sq
8f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
8fa0: 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65  g.xSqllog(sqlite
8fb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
8fc0: 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c  qllogArg, db, 0,
8fd0: 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   2);.  }.#endif.
8fe0: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
8ff0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74  e connection int
9000: 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74  o a zombie and t
9010: 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20  hen close it..  
9020: 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  */.  db->magic =
9030: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f   SQLITE_MAGIC_ZO
9040: 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c  MBIE;.  sqlite3L
9050: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
9060: 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72  eZombie(db);.  r
9070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61  .}../*.** Two va
9090: 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  riations on the 
90a0: 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65  public interface
90b0: 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64   for closing a d
90c0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
90d0: 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74  ction. The sqlit
90e0: 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69  e3_close() versi
90f0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
9100: 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65  E_BUSY and.** le
9110: 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  aves the connect
9120: 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68  ion option if th
9130: 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69  ere are unfinali
9140: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
9150: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
9160: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
9170: 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73  _backups.  The s
9180: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
9190: 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72  ).** version for
91a0: 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ces the connecti
91b0: 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a  on to become a z
91c0: 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61  ombie if there a
91d0: 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72  re.** unclosed r
91e0: 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72  esources, and ar
91f0: 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c  ranges for deall
9200: 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  ocation when the
9210: 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65   last.** prepare
9220: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71   statement or sq
9230: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f  lite3_backup clo
9240: 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ses..*/.int sqli
9250: 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  te3_close(sqlite
9260: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
9270: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30  qlite3Close(db,0
9280: 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  ); }.int sqlite3
9290: 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65  _close_v2(sqlite
92a0: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
92b0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31  qlite3Close(db,1
92c0: 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ); }.../*.** Clo
92d0: 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  se the mutex on 
92e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
92f0: 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75  ion db..**.** Fu
9300: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61  rthermore, if da
9310: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9320: 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65  n db is a zombie
9330: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74   (meaning that t
9340: 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  here.** has been
9350: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
9360: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
9370: 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c  b) or sqlite3_cl
9380: 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a  ose_v2(db)) and.
9390: 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  ** every sqlite3
93a0: 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65  _stmt has now be
93b0: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
93c0: 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62   every sqlite3_b
93d0: 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e  ackup has.** fin
93e0: 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65  ished, then free
93f0: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
9400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c  */.void sqlite3L
9410: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
9420: 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20  eZombie(sqlite3 
9430: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
9440: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
9450: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
9460: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
9470: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  /.  int j;..  /*
9480: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
9490: 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65  tstanding sqlite
94a0: 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65  3_stmt or sqlite
94b0: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
94c0: 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  .  ** or if the 
94d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e  connection has n
94e0: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73  ot yet been clos
94f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c  ed by sqlite3_cl
9500: 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74  ose_v2(),.  ** t
9510: 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74  hen just leave t
9520: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74  he mutex and ret
9530: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
9540: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
9550: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c  E_MAGIC_ZOMBIE |
9560: 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  | connectionIsBu
9570: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
9580: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9590: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
95a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
95b0: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
95c0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
95d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61  eans that the da
95e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
95f0: 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65  n has.  ** close
9600: 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74  d all sqlite3_st
9610: 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62  mt and sqlite3_b
9620: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e  ackup objects an
9630: 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  d has been.  ** 
9640: 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
9650: 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67  3_close (meaning
9660: 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f   that it is a zo
9670: 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72  mbie).  Therefor
9680: 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  e,.  ** go ahead
9690: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65   and free all re
96a0: 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20  sources..  */.. 
96b0: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
96c0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f  tion is open, ro
96d0: 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73  ll it back. This
96e0: 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68   also ensures th
96f0: 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64  at if.  ** any d
9700: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20  atabase schemas 
9710: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
9720: 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69  ed by an uncommi
9730: 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
9740: 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72  .  ** they are r
9750: 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74  eset. And that t
9760: 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72  he required b-tr
9770: 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
9780: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68   to make.  ** th
9790: 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b  e pager rollback
97a0: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
97b0: 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72  t an atomic oper
97c0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69  ation. */.  sqli
97d0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
97e0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a  b, SQLITE_OK);..
97f0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
9800: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
9810: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
9820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
9830: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
9840: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
9850: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9860: 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a  tions */.  for(j
9870: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
9880: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9890: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
98a0: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
98b0: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
98c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
98d0: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
98e0: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
98f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
9900: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
9910: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
9920: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9930: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
9940: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
9950: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
9960: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
9970: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
9980: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
9990: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
99a0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
99b0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
99c0: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
99d0: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
99e0: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
99f0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
9a00: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
9a10: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
9a20: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
9a30: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
9a40: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
9a50: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
9a60: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
9a70: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
9a80: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
9a90: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
9aa0: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
9ab0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
9ac0: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
9ad0: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
9ae0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
9af0: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
9b00: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
9b10: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9b20: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9b30: 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  c); i; i=sqliteH
9b40: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
9b50: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
9b60: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
9b70: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9b80: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75      do{.      fu
9b90: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9ba0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  , p);.      pNex
9bb0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9bc0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9bd0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
9be0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p = pNext;.    }
9bf0: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a  while( p );.  }.
9c00: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9c10: 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a  ar(&db->aFunc);.
9c20: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9c30: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9c40: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
9c50: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9c60: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9c70: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
9c80: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9c90: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
9ca0: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
9cb0: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
9cc0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9cd0: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
9ce0: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
9cf0: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
9d00: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
9d10: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
9d20: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
9d30: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
9d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9d50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9d60: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
9d70: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9d80: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
9d90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9da0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9db0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9dc0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9dd0: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
9de0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9df0: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
9e00: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
9e10: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9e20: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
9e30: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
9e40: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
9e50: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
9e60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  }.    sqlite3Vta
9e70: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43  bEponymousTableC
9e80: 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  lear(db, pMod);.
9e90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9ea0: 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  e(db, pMod);.  }
9eb0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9ec0: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
9ed0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
9ee0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
9ef0: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
9f00: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
9f10: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
9f20: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
9f30: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
9f40: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
9f50: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
9f60: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
9f70: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
9f80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9f90: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
9fa0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
9fb0: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
9fc0: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
9fd0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
9fe0: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
9ff0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
a000: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
a010: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
a020: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
a030: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
a040: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
a050: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
a060: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
a070: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
a080: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
a090: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
a0a0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
a0b0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
a0c0: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
a0d0: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
a0e0: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
a0f0: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
a100: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
a110: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
a120: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
a130: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
a140: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
a150: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
a160: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a170: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a180: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
a190: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
a1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a1b0: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
a1c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a1d0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
a1e0: 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69  (db,0)==0 );.  i
a1f0: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
a200: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
a210: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
a230: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  art);.  }.  sqli
a240: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a  te3_free(db);.}.
a250: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
a260: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
a270: 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65  es.  If tripCode
a280: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
a290: 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77  K, then.** any w
a2a0: 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
a2b0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
a2c0: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
a2d0: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
a2e0: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
a2f0: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
a300: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
a310: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
a320: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
a330: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
a340: 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73  rsor.  Read curs
a350: 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20  ors remain open 
a360: 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74  and valid.** but
a370: 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20   are "saved" in 
a380: 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70  case the table p
a390: 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61  ages are moved a
a3a0: 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  round..*/.void s
a3b0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
a3c0: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
a3d0: 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
a3e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54  int i;.  int inT
a3f0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rans = 0;.  int 
a400: 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  schemaChange;.  
a410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a420: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
a430: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
a440: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
a450: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
a460: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
a470: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
a480: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
a490: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
a4a0: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
a4b0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
a4c0: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
a4d0: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
a4e0: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
a4f0: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
a500: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
a510: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
a520: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
a530: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
a540: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
a550: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
a560: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
a570: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
a580: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
a590: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
a5a0: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
a5b0: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
a5c0: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
a5d0: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
a5e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
a5f0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
a600: 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20  .  schemaChange 
a610: 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  = (db->mDbFlags 
a620: 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  & DBFLAG_SchemaC
a630: 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d  hange)!=0 && db-
a640: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a  >init.busy==0;..
a650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a660: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a670: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
a680: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
a690: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66  f( p ){.      if
a6a0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
a6b0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
a6c0: 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20        inTrans = 
a6d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a6e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a6f0: 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64  lback(p, tripCod
a700: 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65  e, !schemaChange
a710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a720: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
a730: 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ck(db);.  sqlite
a740: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
a750: 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e  ();..  if( (db->
a760: 6d 44 62 46 6c 61 67 73 26 44 42 46 4c 41 47 5f  mDbFlags&DBFLAG_
a770: 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30  SchemaChange)!=0
a780: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
a790: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
a7a0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
a7b0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
a7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
a7d0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
a7e0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
a7f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
a800: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
a810: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
a820: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
a830: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
a840: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
a850: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
a860: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
a870: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
a880: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
a890: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
a8a0: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
a8b0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
a8c0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
a8d0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
a8e0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
a8f0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
a900: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
a910: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
a920: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
a930: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
a940: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
a950: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
a960: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a970: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
a980: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
a990: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
a9a0: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
a9b0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
a9c0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
a9d0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
a9e0: 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e  QLITE_NEED_ERR_N
a9f0: 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  AME).const char 
aa00: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
aa10: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
aa20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
aa30: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
aa40: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
aa50: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
aa60: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
aa70: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
aa80: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
aa90: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aab0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
aac0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
aad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aae0: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
aaf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
ab00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
ab10: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
ab20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab30: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
ab40: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
ab50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab60: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
ab70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ab80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
ab90: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
aba0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abb0: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
abc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
abe0: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
abf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac00: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
ac10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ac30: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
ac40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac50: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
ac60: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
ac70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac80: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
ac90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aca0: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
acb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
acc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
acd0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
ace0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
acf0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
ad00: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
ad10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad20: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
ad30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ad40: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
ad50: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
ad60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad70: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
ad80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ad90: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
ada0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
adb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
adc0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
add0: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
ade0: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
adf0: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
ae00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae10: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 56 54 41 42  LITE_LOCKED_VTAB
ae20: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
ae30: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
ae40: 56 54 41 42 22 3b 20 20 20 20 20 20 20 62 72 65  VTAB";       bre
ae50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
ae70: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ae80: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
ae90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
aea0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aeb0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
aec0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
aed0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
aee0: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
aef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af00: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
af10: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
af20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
af30: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af50: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
af60: 59 5f 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61  Y_CANTINIT:  zNa
af70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
af80: 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b  DONLY_CANTINIT";
af90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afa0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
afb0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
afc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
afd0: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
afe0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
aff0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
b000: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
b010: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
b020: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
b030: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
b040: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
b050: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20  ONLY_DIRECTORY: 
b060: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b070: 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f  READONLY_DIRECTO
b080: 52 59 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  RY";break;.     
b090: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
b0a0: 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ERRUPT:         
b0b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0c0: 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20  _INTERRUPT";    
b0d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b0f0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
b100: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b110: 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20  E_IOERR";       
b120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b140: 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20  OERR_READ:      
b150: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b160: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20  TE_IOERR_READ"; 
b170: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b190: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
b1a0: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b1b0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
b1c0: 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  READ";  break;. 
b1d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b1e0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20  _IOERR_WRITE:   
b1f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b200: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
b210: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b220: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b230: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20  E_IOERR_FSYNC:  
b240: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b250: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
b260: 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  C";       break;
b270: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b280: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
b290: 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  NC:    zName = "
b2a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b2b0: 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b  _FSYNC";   break
b2c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b2d0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
b2e0: 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TE:     zName = 
b2f0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  "SQLITE_IOERR_TR
b300: 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61  UNCATE";    brea
b310: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b320: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
b330: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b340: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
b350: 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65  STAT";       bre
b360: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b370: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b380: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
b390: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b3a0: 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  UNLOCK";      br
b3b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b3c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b3d0: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
b3e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b3f0: 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _RDLOCK";      b
b400: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b410: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b420: 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LETE:       zNam
b430: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b440: 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20  R_DELETE";      
b450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b460: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
b470: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61  OMEM:        zNa
b480: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b490: 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  RR_NOMEM";      
b4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4b0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b4c0: 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e  ACCESS:       zN
b4d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b4e0: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
b4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b500: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b510: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
b520: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b550: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b560: 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72  ESERVEDLOCK"; br
b570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b590: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b5a0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b5b0: 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62  _LOCK";        b
b5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b5d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
b5e0: 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  OSE:        zNam
b5f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b600: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20  R_CLOSE";       
b610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b620: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b630: 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61  IR_CLOSE:    zNa
b640: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b650: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20  RR_DIR_CLOSE";  
b660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b670: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b680: 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e  SHMOPEN:      zN
b690: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b6a0: 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20  ERR_SHMOPEN";   
b6b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6c0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b6d0: 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a  _SHMSIZE:      z
b6e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b6f0: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20  OERR_SHMSIZE";  
b700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b710: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b720: 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20  R_SHMLOCK:      
b730: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b740: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20  IOERR_SHMLOCK"; 
b750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b770: 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20  RR_SHMMAP:      
b780: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b790: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20  _IOERR_SHMMAP"; 
b7a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b7b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b7c0: 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20  ERR_SEEK:       
b7d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b7e0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20  E_IOERR_SEEK";  
b7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b800: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b810: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
b820: 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  T: zName = "SQLI
b830: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
b840: 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20  NOENT";break;.  
b850: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b860: 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20  IOERR_MMAP:     
b870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b880: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b  ITE_IOERR_MMAP";
b890: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b8a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8b0: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
b8c0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b8d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
b8e0: 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  MPPATH"; break;.
b8f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b900: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
b910: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b920: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
b930: 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b  PATH";    break;
b940: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b950: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20  TE_CORRUPT:     
b960: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b970: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
b980: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b990: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
b9b0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b9c0: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  "SQLITE_CORRUPT_
b9d0: 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61  VTAB";      brea
b9e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b9f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 53 45 51  LITE_CORRUPT_SEQ
ba00: 55 45 4e 43 45 3a 20 20 20 7a 4e 61 6d 65 20 3d  UENCE:   zName =
ba10: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
ba20: 5f 53 45 51 55 45 4e 43 45 22 3b 20 20 62 72 65  _SEQUENCE";  bre
ba30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba40: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
ba50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ba60: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
ba70: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
ba80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba90: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
baa0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bab0: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
bac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
bad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bae0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
baf0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
bb00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bb10: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
bb20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb30: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bb40: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
bb50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bb60: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
bb70: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
bb80: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
bb90: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
bba0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
bbb0: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
bbc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bbd0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
bbe0: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
bbf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bc00: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
bc10: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bc20: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
bc30: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
bc40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bc50: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
bc60: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
bc70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
bc80: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
bc90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bca0: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
bcb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bcc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
bcd0: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
bce0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bcf0: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
bd00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
bd20: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
bd30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bd40: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
bd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bd60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd70: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
bd80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bd90: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
bda0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bdb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bdc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
bdd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bde0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
bdf0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
be00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be10: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
be20: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
be30: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
be40: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
be50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be60: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
be70: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
be80: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
be90: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
bea0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
beb0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
bec0: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bef0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bf00: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
bf10: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
bf20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bf30: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
bf40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf50: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
bf60: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
bf70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bf80: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
bf90: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bfc0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bfd0: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
bfe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bff0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c000: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
c010: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c020: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
c030: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
c040: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c050: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
c060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c090: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
c0a0: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
c0b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c0c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
c0d0: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
c0e0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c0f0: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
c100: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c110: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c120: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c150: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c160: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
c170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c190: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
c1a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c1b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
c1c0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
c1d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
c1e0: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
c1f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c200: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
c210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c220: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
c230: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
c240: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c250: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
c260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c270: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c280: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
c290: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c2a0: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
c2b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c2c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c2d0: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
c2e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c2f0: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
c300: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c310: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c320: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
c330: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c340: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
c350: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c360: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c370: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
c380: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c390: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c3b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c3c0: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
c3d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c3e0: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c400: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c410: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
c420: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c430: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c450: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c460: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
c470: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c480: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
c490: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
c4a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c4b0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
c4c0: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
c4d0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
c4e0: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
c4f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c500: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
c510: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
c520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c550: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c560: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
c570: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c580: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
c590: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c5a0: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
c5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
c5c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c5d0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
c5e0: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
c5f0: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
c600: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
c610: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c620: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
c630: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c640: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
c660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c670: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
c680: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
c690: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
c6a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c6b0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
c6c0: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
c6d0: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
c6e0: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
c6f0: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
c700: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
c710: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
c720: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
c730: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
c740: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
c750: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
c760: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
c770: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
c780: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
c790: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
c7a0: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
c7b0: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
c7c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
c7d0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
c7e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
c7f0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
c800: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
c810: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
c820: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
c830: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
c840: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
c850: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
c860: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
c870: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
c880: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 71  BORT       */ "q
c890: 75 65 72 79 20 61 62 6f 72 74 65 64 22 2c 0a 20  uery aborted",. 
c8a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53     /* SQLITE_BUS
c8b0: 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  Y        */ "dat
c8c0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
c8d0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c8e0: 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22  LOCKED      */ "
c8f0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
c900: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
c910: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20  * SQLITE_NOMEM  
c920: 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20       */ "out of 
c930: 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20  memory",.    /* 
c940: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
c950: 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74     */ "attempt t
c960: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
c970: 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ly database",.  
c980: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
c990: 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65  RRUPT   */ "inte
c9a0: 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a  rrupted",.    /*
c9b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20   SQLITE_IOERR   
c9c0: 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f      */ "disk I/O
c9d0: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c9e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20  SQLITE_CORRUPT  
c9f0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
ca00: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
ca10: 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a  lformed",.    /*
ca20: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
ca30: 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20      */ "unknown 
ca40: 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20  operation",.    
ca50: 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20  /* SQLITE_FULL  
ca60: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
ca70: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
ca80: 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ll",.    /* SQLI
ca90: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a  TE_CANTOPEN    *
caa0: 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  / "unable to ope
cab0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
cac0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cad0: 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22  PROTOCOL    */ "
cae0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
caf0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cb00: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
cb10: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
cb20: 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20  _SCHEMA      */ 
cb30: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
cb40: 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20   has changed",. 
cb50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f     /* SQLITE_TOO
cb60: 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72  BIG      */ "str
cb70: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20  ing or blob too 
cb80: 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  big",.    /* SQL
cb90: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20  ITE_CONSTRAINT  
cba0: 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  */ "constraint f
cbb0: 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ailed",.    /* S
cbc0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20  QLITE_MISMATCH  
cbd0: 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d    */ "datatype m
cbe0: 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a  ismatch",.    /*
cbf0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20   SQLITE_MISUSE  
cc00: 20 20 20 20 2a 2f 20 22 62 61 64 20 70 61 72 61      */ "bad para
cc10: 6d 65 74 65 72 20 6f 72 20 6f 74 68 65 72 20 41  meter or other A
cc20: 50 49 20 6d 69 73 75 73 65 22 2c 0a 23 69 66 64  PI misuse",.#ifd
cc30: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
cc40: 45 5f 4c 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c  E_LFS.    /* SQL
cc50: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
cc60: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
cc70: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
cc80: 65 64 22 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f  ed",.#else.    /
cc90: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
cca0: 20 20 20 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69       */ 0,.#endi
ccb0: 66 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  f.    /* SQLITE_
ccc0: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
ccd0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
cce0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
ccf0: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
cd00: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
cd10: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
cd20: 20 2a 2f 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65   */ "column inde
cd30: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
cd40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
cd50: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
cd60: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 64 61 74  ile is not a dat
cd70: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
cd80: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20 20 20 20  QLITE_NOTICE    
cd90: 20 20 2a 2f 20 22 6e 6f 74 69 66 69 63 61 74 69    */ "notificati
cda0: 6f 6e 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 20  on message",.   
cdb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 41 52 4e 49   /* SQLITE_WARNI
cdc0: 4e 47 20 20 20 20 20 2a 2f 20 22 77 61 72 6e 69  NG     */ "warni
cdd0: 6e 67 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d  ng message",.  }
cde0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
cdf0: 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  zErr = "unknown 
ce00: 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68  error";.  switch
ce10: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
ce20: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
ce30: 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20  LLBACK: {.      
ce40: 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75  zErr = "abort du
ce50: 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a  e to ROLLBACK";.
ce60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ce70: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
ce80: 54 45 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  TE_ROW: {.      
ce90: 7a 45 72 72 20 3d 20 22 61 6e 6f 74 68 65 72 20  zErr = "another 
cea0: 72 6f 77 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a  row available";.
ceb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cec0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
ced0: 54 45 5f 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20  TE_DONE: {.     
cee0: 20 7a 45 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65   zErr = "no more
cef0: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 22   rows available"
cf00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cf10: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
cf20: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
cf30: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
cf40: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
cf50: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
cf60: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
cf70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
cf80: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
cf90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cfa0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
cfb0: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
cfc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cfd0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
cfe0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
cff0: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
d000: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
d010: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
d020: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
d030: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
d040: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
d050: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
d060: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
d070: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
d080: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
d090: 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
d0a0: 65 72 6f 20 74 6f 20 72 65 74 72 79 20 74 68 65  ero to retry the
d0b0: 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a   lock.  Return z
d0c0: 65 72 6f 20 74 6f 20 73 74 6f 70 20 74 72 79 69  ero to stop tryi
d0d0: 6e 67 0a 2a 2a 20 61 6e 64 20 63 61 75 73 65 20  ng.** and cause 
d0e0: 53 51 4c 69 74 65 20 74 6f 20 72 65 74 75 72 6e  SQLite to return
d0f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f   SQLITE_BUSY..*/
d100: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
d110: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
d120: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
d130: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
d140: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
d150: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
d160: 74 20 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  t count,        
d170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d180: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
d190: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
d1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d1b0: 2a 70 46 69 6c 65 20 20 20 20 20 20 2f 2a 20 54  *pFile      /* T
d1c0: 68 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68  he file on which
d1d0: 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72   the lock occurr
d1e0: 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  ed */.){.#if SQL
d1f0: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41  ITE_OS_WIN || HA
d200: 56 45 5f 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54  VE_USLEEP.  /* T
d210: 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20  his case is for 
d220: 73 79 73 74 65 6d 73 20 74 68 61 74 20 68 61 76  systems that hav
d230: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 73 6c  e support for sl
d240: 65 65 70 69 6e 67 20 66 6f 72 20 66 72 61 63 74  eeping for fract
d250: 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73  ions of.  ** a s
d260: 65 63 6f 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73  econd.  Examples
d270: 3a 20 20 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73  :  All windows s
d280: 79 73 74 65 6d 73 2c 20 75 6e 69 78 20 73 79 73  ystems, unix sys
d290: 74 65 6d 73 20 77 69 74 68 20 75 73 6c 65 65 70  tems with usleep
d2a0: 28 29 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  () */.  static c
d2b0: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
d2c0: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
d2d0: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
d2e0: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
d2f0: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
d300: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
d310: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
d320: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
d330: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
d340: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
d350: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
d360: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
d370: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
d380: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
d390: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75  )ptr;.  int tmou
d3a0: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
d3b0: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
d3c0: 2c 20 70 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66  , prior;..#ifdef
d3d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d3e0: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69  ETLK_TIMEOUT.  i
d3f0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
d400: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51  Control(pFile,SQ
d410: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f  LITE_FCNTL_LOCK_
d420: 54 49 4d 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d  TIMEOUT,&tmout)=
d430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d440: 20 20 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20    if( count ){. 
d450: 20 20 20 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a       tmout = 0;.
d460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
d470: 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65  ileControl(pFile
d480: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  , SQLITE_FCNTL_L
d490: 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d  OCK_TIMEOUT, &tm
d4a0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  out);.      retu
d4b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
d4c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
d4e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d4f0: 54 45 52 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64  TER(pFile);.#end
d500: 69 66 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  if.  assert( cou
d510: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
d520: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
d530: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
d540: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
d550: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
d560: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
d570: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
d580: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
d590: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
d5a0: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
d5b0: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
d5c0: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
d5d0: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
d5e0: 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20 64 65   tmout ){.    de
d5f0: 6c 61 79 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72  lay = tmout - pr
d600: 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c  ior;.    if( del
d610: 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ay<=0 ) return 0
d620: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
d630: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
d640: 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20   delay*1000);.  
d650: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
d660: 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 66    /* This case f
d670: 6f 72 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20  or unix systems 
d680: 74 68 61 74 20 6c 61 63 6b 20 75 73 6c 65 65 70  that lack usleep
d690: 28 29 20 73 75 70 70 6f 72 74 2e 20 20 53 6c 65  () support.  Sle
d6a0: 65 70 69 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20  eping.  ** must 
d6b0: 62 65 20 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65  be done in incre
d6c0: 6d 65 6e 74 73 20 6f 66 20 77 68 6f 6c 65 20 73  ments of whole s
d6d0: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69  econds */.  sqli
d6e0: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
d6f0: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
d700: 74 6d 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  tmout = ((sqlite
d710: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
d720: 6d 65 6f 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f  meout;.  UNUSED_
d730: 50 41 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29  PARAMETER(pFile)
d740: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
d750: 29 2a 31 30 30 30 20 3e 20 74 6d 6f 75 74 20 29  )*1000 > tmout )
d760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d770: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
d780: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
d790: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
d7a0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
d7b0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
d7c0: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
d7d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
d7e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d7f0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
d800: 6f 6e 20 66 61 69 6c 65 64 20 74 6f 20 61 63 71  on failed to acq
d810: 75 69 72 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f  uire a.** lock o
d820: 6e 20 56 46 53 20 66 69 6c 65 20 70 46 69 6c 65  n VFS file pFile
d830: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
d840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
d850: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
d860: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
d870: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
d880: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
d890: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
d8a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
d8b0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
d8c0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
d8d0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
d8e0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  *p, sqlite3_file
d8f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
d900: 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 78 42 75  rc;.  if( p->xBu
d910: 73 79 48 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20  syHandler==0 || 
d920: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
d930: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
d940: 62 45 78 74 72 61 46 69 6c 65 41 72 67 20 29 7b  bExtraFileArg ){
d950: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
d960: 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 77  xtra parameter w
d970: 69 74 68 20 74 68 65 20 70 46 69 6c 65 20 70 6f  ith the pFile po
d980: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 64  inter to the end
d990: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
d9a0: 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
d9b0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74   list */.    int
d9c0: 20 28 2a 78 54 72 61 29 28 76 6f 69 64 2a 2c 69   (*xTra)(void*,i
d9d0: 6e 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  nt,sqlite3_file*
d9e0: 29 3b 0a 20 20 20 20 78 54 72 61 20 3d 20 28 69  );.    xTra = (i
d9f0: 6e 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  nt(*)(void*,int,
da00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 29 70  sqlite3_file*))p
da10: 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->xBusyHandler;.
da20: 20 20 20 20 72 63 20 3d 20 78 54 72 61 28 70 2d      rc = xTra(p-
da30: 3e 70 42 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42  >pBusyArg, p->nB
da40: 75 73 79 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d  usy, pFile);.  }
da50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67  else{.    /* Leg
da60: 61 63 79 20 73 74 79 6c 65 20 62 75 73 79 20 68  acy style busy h
da70: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
da80: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 78  */.    rc = p->x
da90: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70  BusyHandler(p->p
daa0: 42 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73  BusyArg, p->nBus
dab0: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  y);.  }.  if( rc
dac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42  ==0 ){.    p->nB
dad0: 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  usy = -1;.  }els
dae0: 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b  e{.    p->nBusy+
daf0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
db00: 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc; .}../*.** Th
db10: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
db20: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
db30: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
db40: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
db50: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
db60: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
db70: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
db80: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
db90: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
dba0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
dbb0: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
dbc0: 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  oid*,int),.  voi
dbd0: 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65  d *pArg.){.#ifde
dbe0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
dbf0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
dc00: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
dc10: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
dc20: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
dc30: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
dc40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
dc50: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
dc60: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
dc70: 72 2e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  r.xBusyHandler =
dc80: 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75   xBusy;.  db->bu
dc90: 73 79 48 61 6e 64 6c 65 72 2e 70 42 75 73 79 41  syHandler.pBusyA
dca0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d  rg = pArg;.  db-
dcb0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75  >busyHandler.nBu
dcc0: 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75  sy = 0;.  db->bu
dcd0: 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61  syHandler.bExtra
dce0: 46 69 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 64  FileArg = 0;.  d
dcf0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
dd00: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
dd10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
dd20: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
dd30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
dd40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd50: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
dd60: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
dd70: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
dd80: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
dd90: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
dda0: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
ddb0: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
ddc0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
ddd0: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
dde0: 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  t. The progress 
ddf0: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a  callback will.**
de00: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72   be invoked ever
de10: 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a  y nOps opcodes..
de20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
de30: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
de40: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
de50: 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20   .  int nOps,.  
de60: 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29  int (*xProgress)
de70: 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64  (void*), .  void
de80: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
de90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
dea0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
deb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
dec0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
ded0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
dee0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
def0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
df00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
df10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
df20: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
df30: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
df40: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
df50: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
df60: 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e  essOps = (unsign
df70: 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d  ed)nOps;.    db-
df80: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
df90: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
dfa0: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
dfb0: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
dfc0: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
dfd0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
dfe0: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
dff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e000: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
e010: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
e020: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
e030: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
e040: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
e050: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
e060: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
e070: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
e080: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
e090: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
e0a0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
e0b0: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
e0c0: 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65  , int ms){.#ifde
e0d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e0e0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e0f0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
e100: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
e110: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e120: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
e130: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
e140: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
e150: 64 6c 65 72 28 64 62 2c 20 28 69 6e 74 28 2a 29  dler(db, (int(*)
e160: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69  (void*,int))sqli
e170: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
e180: 6c 62 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  lback,.         
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a      (void*)db);.
e1b0: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
e1c0: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62  out = ms;.    db
e1d0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45  ->busyHandler.bE
e1e0: 78 74 72 61 46 69 6c 65 41 72 67 20 3d 20 31 3b  xtraFileArg = 1;
e1f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
e200: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
e210: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
e220: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e230: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e240: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
e250: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
e260: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
e270: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
e280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
e290: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
e2a0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
e2b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e2c0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e2d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e2e0: 4f 6b 28 64 62 29 20 26 26 20 28 64 62 3d 3d 30  Ok(db) && (db==0
e2f0: 20 7c 7c 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53   || db->magic!=S
e300: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42  QLITE_MAGIC_ZOMB
e310: 49 45 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  IE) ){.    (void
e320: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e330: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
e340: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62  .  }.#endif.  db
e350: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
e360: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
e370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e380: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
e390: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
e3a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
e3b0: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
e3c0: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
e3d0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
e3e0: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
e3f0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
e400: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
e410: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
e420: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e430: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
e440: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
e450: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
e460: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
e470: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
e480: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
e490: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
e4a0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
e4b0: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
e4c0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
e4d0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
e4e0: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
e4f0: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
e500: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e510: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e520: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e530: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e540: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e550: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
e560: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e570: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
e580: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
e590: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
e5a0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
e5b0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69    int nName;.  i
e5c0: 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a  nt extraFlags;..
e5d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e5e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
e5f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
e600: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
e610: 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75  0 ||.      (xSFu
e620: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
e630: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
e640: 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20 28     (!xSFunc && (
e650: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
e660: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53  )) ||.      (!xS
e670: 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c  Func && (!xFinal
e680: 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20   && xStep)) ||. 
e690: 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c       (nArg<-1 ||
e6a0: 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58   nArg>SQLITE_MAX
e6b0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c  _FUNCTION_ARG) |
e6c0: 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e  |.      (255<(nN
e6d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
e6e0: 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e  len30( zFunction
e6f0: 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72  Name))) ){.    r
e700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
e710: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
e720: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e730: 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53  FUNC_CONSTANT==S
e740: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
e750: 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c  TIC );.  extraFl
e760: 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c  ags = enc &  SQL
e770: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
e780: 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c  C;.  enc &= (SQL
e790: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
e7a0: 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20  |SQLITE_ANY);.  
e7b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e7c0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
e7d0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
e7e0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
e7f0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
e800: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
e810: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
e820: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
e830: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
e840: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
e850: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
e860: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
e870: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
e880: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
e890: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
e8a0: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
e8b0: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
e8c0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
e8d0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
e8e0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
e8f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
e900: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
e910: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
e920: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
e930: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
e940: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
e950: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
e960: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e970: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
e980: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
e990: 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46  LITE_UTF8|extraF
e9a0: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70  lags,.         p
e9b0: 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63  UserData, xSFunc
e9c0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
e9d0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
e9e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e9f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
ea00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
ea10: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
ea20: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
ea30: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
ea40: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
ea50: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53     pUserData, xS
ea60: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
ea70: 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72  nal, pDestructor
ea80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ea90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eaa0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
eab0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63  c;.    }.    enc
eac0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
ead0: 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65  E;.  }.#else.  e
eae0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
eaf0: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  ;.#endif.  .  /*
eb00: 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69   Check if an exi
eb10: 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  sting function i
eb20: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
eb30: 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  en or deleted. I
eb40: 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74  f so,.  ** and t
eb50: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
eb60: 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  VMs, then return
eb70: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66   SQLITE_BUSY. If
eb80: 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a   a function.  **
eb90: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
eba0: 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74  dden/deleted but
ebb0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
ebc0: 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20  tive VMs, allow 
ebd0: 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  the.  ** operati
ebe0: 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62  on to continue b
ebf0: 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  ut invalidate al
ec00: 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  l precompiled st
ec10: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
ec20: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
ec30: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
ec40: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
ec50: 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20  , (u8)enc, 0);. 
ec60: 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75   if( p && (p->fu
ec70: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
ec80: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d  _FUNC_ENCMASK)==
ec90: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
eca0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
ecb0: 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
ecc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ecd0: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
ece0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
ecf0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
ed00: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
ed10: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75  user-function du
ed20: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
ed30: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
ed40: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
ed50: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ed60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ed70: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
ed80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ed90: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
eda0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
edb0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
edc0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
edd0: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
ede0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
edf0: 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  nc, 1);.  assert
ee00: 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (p || db->malloc
ee10: 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21  Failed);.  if( !
ee20: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ee30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ee40: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
ee50: 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  an older version
ee60: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
ee70: 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72   with a configur
ee80: 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  ed destructor is
ee90: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c  .  ** being repl
eea0: 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20  aced invoke the 
eeb0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
eec0: 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66  ion here. */.  f
eed0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
eee0: 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44  b, p);..  if( pD
eef0: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
ef00: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
ef10: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75  ef++;.  }.  p->u
ef20: 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  .pDestructor = p
ef30: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
ef40: 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d  >funcFlags = (p-
ef50: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
ef60: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
ef70: 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  ) | extraFlags;.
ef80: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
ef90: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
efa0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
efb0: 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d  );.  p->xSFunc =
efc0: 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63   xSFunc ? xSFunc
efd0: 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   : xStep;.  p->x
efe0: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
eff0: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
f000: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
f010: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
f020: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
f030: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f040: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
f050: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
f060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
f070: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
f080: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
f090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
f0a0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
f0b0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
f0c0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
f0d0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
f0e0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
f0f0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
f100: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
f110: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f120: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
f130: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
f140: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
f150: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74  ntext*).){.  ret
f160: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
f170: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
f180: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
f190: 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20  enc, p, xSFunc, 
f1a0: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
f1d0: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
f1e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
f1f0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
f200: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
f210: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
f220: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
f230: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
f240: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
f250: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f260: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f270: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
f280: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
f290: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
f2a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
f2b0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
f2c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f2d0: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  t*),.  void (*xD
f2e0: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
f2f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f300: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
f310: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
f320: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
f330: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f340: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f350: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f360: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
f370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f380: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
f390: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f3a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f3b0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
f3c0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
f3d0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
f3e0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
f3f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
f400: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
f410: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
f420: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
f430: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
f440: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
f450: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
f460: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
f470: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
f480: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
f490: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
f4a0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
f4b0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
f4c0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
f4d0: 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69  inal, pArg);.  i
f4e0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
f4f0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
f500: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f510: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65  TE_OK );.    xDe
f520: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71  stroy(p);.    sq
f530: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f540: 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74  pArg);.  }.. out
f550: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
f560: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
f570: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f580: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f590: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f5a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f5b0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74  E_OMIT_UTF16.int
f5c0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
f5d0: 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71  function16(.  sq
f5e0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
f5f0: 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69  st void *zFuncti
f600: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
f610: 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  rg,.  int eTextR
f620: 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  ep,.  void *p,. 
f630: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
f640: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f650: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f660: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
f670: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
f680: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f690: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
f6a0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
f6b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
f6c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
f6d0: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23  char *zFunc8;..#
f6e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f6f0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f700: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f710: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
f720: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
f730: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
f740: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
f750: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f760: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f770: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
f780: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
f790: 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20  led );.  zFunc8 
f7a0: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
f7b0: 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  8(db, zFunctionN
f7c0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
f7d0: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
f7e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
f7f0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
f800: 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65  8, nArg, eTextRe
f810: 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74  p, p, xSFunc,xSt
f820: 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  ep,xFinal,0);.  
f830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f840: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
f850: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
f860: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
f870: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f880: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
f8a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
f8b0: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
f8c0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
f8d0: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
f8e0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
f8f0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
f900: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
f910: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
f920: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
f930: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
f940: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
f950: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
f960: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
f970: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
f980: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
f990: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
f9a0: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
f9b0: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
f9c0: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
f9d0: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
f9e0: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
f9f0: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
fa00: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
fa10: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
fa20: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
fa30: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
fa40: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
fa50: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
fa60: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
fa70: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
fa80: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
fa90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
faa0: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
fab0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
fac0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
fad0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
fae0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
faf0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
fb00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fb10: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fb20: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fb30: 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
fb40: 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20  e==0 || nArg<-2 
fb50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fb60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
fb70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
fb80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fb90: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fba0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
fbb0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
fbc0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
fbd0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
fbe0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fbf0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
fc00: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
fc10: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
fc40: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
fc50: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
fc60: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
fc70: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
fc80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fc90: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fca0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
fcb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fcc0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
fcd0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
fce0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
fcf0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
fd00: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
fd10: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
fd20: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
fd30: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
fd40: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
fd50: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
fd60: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
fd70: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
fd80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
fd90: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
fda0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
fdb0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
fdc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
fdd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
fde0: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
fdf0: 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  D.void *sqlite3_
fe00: 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
fe10: 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 65 29  b, void(*xTrace)
fe20: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
fe30: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
fe40: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
fe50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fe60: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
fe70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
fe80: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
fe90: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
fea0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
feb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fec0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
fed0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fee0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
fef0: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
ff00: 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65  rg;.  db->mTrace
ff10: 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51 4c 49   = xTrace ? SQLI
ff20: 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43 59 20  TE_TRACE_LEGACY 
ff30: 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  : 0;.  db->xTrac
ff40: 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33 32 2c  e = (int(*)(u32,
ff50: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64  void*,void*,void
ff60: 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64 62 2d  *))xTrace;.  db-
ff70: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
ff80: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
ff90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ffa0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
ffb0: 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
ffc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
ffd0: 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65  ECATED */../* Re
ffe0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 63  gister a trace c
fff0: 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
10000 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74 65  e version-2 inte
10010 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
10020 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 0a  lite3_trace_v2(.
10030 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10060 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e 65  Trace this conne
10070 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  ction */.  unsig
10080 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20 20 20  ned mTrace,     
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
100b0 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20 74 72   events to be tr
100c0 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  aced */.  int(*x
100d0 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64 2c  Trace)(unsigned,
100e0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64  void*,void*,void
100f0 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  *),  /* Callback
10100 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   to invoke */.  
10110 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10140 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64  ntext */.){.#ifd
10150 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10160 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10170 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10180 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
10190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
101a0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
101b0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
101c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
101d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
101e0 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54 72 61  mTrace==0 ) xTra
101f0 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 54  ce = 0;.  if( xT
10200 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61 63 65  race==0 ) mTrace
10210 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72 61   = 0;.  db->mTra
10220 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64  ce = mTrace;.  d
10230 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61  b->xTrace = xTra
10240 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
10250 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10270 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10290 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
102a0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
102b0 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  TED./*.** Regist
102c0 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
102d0 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
102e0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
102f0 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
10300 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
10310 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
10320 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
10330 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
10340 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
10350 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
10360 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
10370 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
10380 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
10390 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
103a0 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
103b0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
103c0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
103d0 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
103e0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
103f0 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
10400 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
10410 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
10420 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
10430 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
10440 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
10450 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
10460 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10470 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10480 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10490 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
104a0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
104b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
104c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
104d0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
104e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
104f0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
10500 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
10510 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
10520 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
10530 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
10540 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
10550 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10560 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10570 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
10580 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10590 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 23  _DEPRECATED */.#
105a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
105b0 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
105c0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
105d0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
105e0 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
105f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
10600 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
10610 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
10620 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
10630 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
10640 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
10650 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
10660 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
10670 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
10680 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10690 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
106a0 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
106b0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
106c0 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
106d0 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
106e0 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
106f0 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
10700 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
10710 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
10720 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
10730 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
10740 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
10750 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10760 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10770 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10780 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
10790 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
107a0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
107b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
107c0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
107d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
107e0 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
107f0 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
10800 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10810 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
10820 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
10830 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10840 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10850 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10860 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
10870 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
10880 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
10890 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
108a0 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
108b0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
108c0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
108d0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
108e0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
108f0 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
10900 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
10910 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10920 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
10930 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
10940 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
10950 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
10960 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
10970 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
10980 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
10990 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
109a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
109b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
109c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
109d0 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
109e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
109f0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
10a00 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
10a10 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
10a20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
10a30 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
10a40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
10a50 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10a60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10a70 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
10a80 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
10a90 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
10aa0 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
10ab0 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
10ac0 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
10ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10ae0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10af0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10b00 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10b10 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
10b20 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
10b30 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
10b40 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
10b50 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
10b60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
10b70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
10b80 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
10b90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10bb0 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
10bc0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
10bd0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
10be0 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
10bf0 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
10c00 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
10c10 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
10c20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
10c30 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
10c40 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
10c50 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
10c60 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10c70 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10c80 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10c90 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
10ca0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10cb0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
10cc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10cd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10ce0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10cf0 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
10d00 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
10d10 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
10d20 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
10d30 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
10d40 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10d50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10d60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10d70 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10d80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10d90 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
10da0 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  K./*.** Register
10db0 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
10dc0 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
10dd0 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
10de0 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
10df0 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
10e00 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
10e10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
10e20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
10e30 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  eupdate_hook(.  
10e40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
10e60 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
10e70 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
10e80 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
10e90 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20  ck)(         /* 
10ea0 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
10eb0 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73  n */.    void*,s
10ec0 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72  qlite3*,int,char
10ed0 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e   const*,char con
10ee0 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  st*,sqlite3_int6
10ef0 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  4,sqlite3_int64)
10f00 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f20 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20   First callback 
10f30 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
10f40 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
10f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10f60 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10f70 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65   pRet = db->pPre
10f80 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
10f90 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
10fa0 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
10fb0 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
10fc0 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
10fd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10fe0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10ff0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
11000 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11010 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
11020 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64  E_HOOK */..#ifnd
11030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
11040 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  AL./*.** The sql
11050 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
11060 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
11070 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  red by sqlite3_w
11080 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
11090 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73  t()..** Invoke s
110a0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
110b0 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d  point if the num
110c0 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
110d0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a   the log file.**
110e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
110f0 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67   sqlite3.pWalArg
11100 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65   cast to an inte
11110 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63  ger (the value c
11120 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20  onfigured by.** 
11130 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
11140 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73  nt())..*/ .int s
11150 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
11160 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43  Hook(.  void *pC
11170 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
11180 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  * Argument */.  
11190 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
111a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
111b0 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
111c0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
111d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a   /* Database */.
111e0 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20    int nFrame    
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11200 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20   of WAL */.){.  
11210 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49  if( nFrame>=SQLI
11220 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43  TE_PTR_TO_INT(pC
11230 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20  lientData) ){.  
11240 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
11250 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11260 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
11270 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62  eckpoint(db, zDb
11280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
11290 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
112a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
112b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
112c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
112d0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
112e0 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69  onfigure an sqli
112f0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
11300 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d  allback to autom
11310 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
11320 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  int.** a databas
11330 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69  e after committi
11340 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
11350 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46   if there are nF
11360 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20  rame or.** more 
11370 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
11380 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20  g file. Passing 
11390 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69  zero or a negati
113a0 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  ve value as the.
113b0 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65  ** nFrame parame
113c0 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74  ter disables aut
113d0 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
113e0 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a  ts entirely..**.
113f0 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
11400 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68  registered by th
11410 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c  is function repl
11420 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e  aces any existin
11430 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65  g callback.** re
11440 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73  gistered using s
11450 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11460 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67  ). Likewise, reg
11470 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62  istering a callb
11480 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ack.** using sql
11490 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
114a0 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74  disables the aut
114b0 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
114c0 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63  t mechanism.** c
114d0 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69  onfigured by thi
114e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
114f0 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  nt sqlite3_wal_a
11500 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  utocheckpoint(sq
11510 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
11520 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  Frame){.#ifdef S
11530 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
11540 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
11550 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
11560 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65  PARAMETER(nFrame
11570 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20  );.#else.#ifdef 
11580 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
11590 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
115a0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
115b0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
115c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
115d0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
115e0 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
115f0 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
11600 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
11610 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
11620 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
11630 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
11640 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
11650 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
11660 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
11670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
11690 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
116a0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
116b0 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
116c0 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
116d0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
116e0 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
116f0 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
11700 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
11710 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
11720 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
11730 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
11740 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
11750 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
11760 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
11770 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
11780 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
11790 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
117a0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
117b0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
117c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
117d0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
117e0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
117f0 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
11800 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
11810 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65  oid *pRet;.#ifde
11820 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11830 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
11840 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11850 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
11860 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
11870 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
11880 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
11890 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
118a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
118b0 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
118c0 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62  b->pWalArg;.  db
118d0 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d  ->xWalCallback =
118e0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
118f0 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67  ->pWalArg = pArg
11900 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
11910 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
11920 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
11930 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
11940 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
11950 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
11960 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f  database zDb..*/
11970 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
11980 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
11990 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
119c0 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
119d0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
119e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
119f0 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  e of attached da
11a00 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29  tabase (or NULL)
11a10 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c   */.  int eMode,
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
11a40 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c  CHECKPOINT_* val
11a50 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ue */.  int *pnL
11a60 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  og,             
11a70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11a80 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20  Size of WAL log 
11a90 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69  in frames */.  i
11aa0 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20  nt *pnCkpt      
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ac0 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
11ad0 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68  ber of frames ch
11ae0 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b  eckpointed */.){
11af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11b00 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e  MIT_WAL.  return
11b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
11b20 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  e.  int rc;     
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11b50 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  de */.  int iDb 
11b60 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  = SQLITE_MAX_ATT
11b70 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74  ACHED;  /* sqlit
11b80 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f  e3.aDb[] index o
11b90 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69  f db to checkpoi
11ba0 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
11bb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
11bc0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
11bd0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
11be0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
11bf0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
11c00 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  T;.#endif..  /* 
11c10 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
11c20 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
11c30 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e  to -1 in case an
11c40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
11c50 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20  /.  if( pnLog ) 
11c60 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69  *pnLog = -1;.  i
11c70 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43  f( pnCkpt ) *pnC
11c80 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73  kpt = -1;..  ass
11c90 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
11ca0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d  KPOINT_PASSIVE==
11cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 );.  assert( S
11cc0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11cd0 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73  _FULL==1 );.  as
11ce0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
11cf0 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d  CKPOINT_RESTART=
11d00 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
11d10 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11d20 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b  T_TRUNCATE==3 );
11d30 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c  .  if( eMode<SQL
11d40 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
11d50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e  ASSIVE || eMode>
11d60 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11d70 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  T_TRUNCATE ){.  
11d80 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11d90 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20  : R-03996-12088 
11da0 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20  The M parameter 
11db0 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20  must be a valid 
11dc0 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a  checkpoint.    *
11dd0 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72  * mode: */.    r
11de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
11df0 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  USE;.  }..  sqli
11e00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11e10 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
11e20 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20  ( zDb && zDb[0] 
11e30 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  ){.    iDb = sql
11e40 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
11e50 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69  b, zDb);.  }.  i
11e60 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
11e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
11e80 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
11e90 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
11ea0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
11eb0 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
11ec0 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
11ed0 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  se{.    db->busy
11ee0 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
11ef0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
11f00 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
11f10 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
11f20 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
11f30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11f40 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63  b, rc);.  }.  rc
11f50 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
11f60 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a  t(db, rc);..  /*
11f70 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
11f80 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
11f90 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20 69 6e  ts, clear the in
11fa0 74 65 72 72 75 70 74 20 66 6c 61 67 20 61 74 20  terrupt flag at 
11fb0 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e  this.  ** point.
11fc0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
11fd0 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b  VdbeActive==0 ){
11fe0 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e  .    db->u1.isIn
11ff0 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b 0a 20  terrupted = 0;. 
12000 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
12010 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12020 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
12030 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
12040 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
12050 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20  atabase zDb. If 
12060 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  zDb is NULL, or 
12070 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44  if the buffer zD
12080 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63  b points.** to c
12090 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c  ontains a zero-l
120a0 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c  ength string, al
120b0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
120c0 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65  ases are .** che
120d0 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  ckpointed..*/.in
120e0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
120f0 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
12100 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
12110 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49   *zDb){.  /* EVI
12120 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31  DENCE-OF: R-4161
12130 33 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69  3-20553 The sqli
12140 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
12150 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76  nt(D,X) is equiv
12160 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71  alent to.  ** sq
12170 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12180 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49  oint_v2(D,X,SQLI
12190 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
121a0 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20  SSIVE,0,0). */. 
121b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
121c0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
121d0 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f  2(db,zDb,SQLITE_
121e0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
121f0 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e  VE,0,0);.}..#ifn
12200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12210 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
12220 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
12230 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
12240 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
12250 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
12260 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
12270 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
12280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
12290 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
122a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
122b0 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
122c0 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
122d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
122e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
122f0 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
12300 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
12310 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
12320 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
12330 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
12340 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
12350 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
12360 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
12370 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
12380 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
12390 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
123a0 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
123b0 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
123c0 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
123d0 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
123e0 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
123f0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
12400 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
12410 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
12420 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
12430 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
12440 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
12450 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
12460 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
12470 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
12480 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
12490 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
124a0 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
124b0 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
124c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
124d0 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
124e0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
124f0 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
12500 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
12510 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
12520 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
12530 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
12540 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
12550 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
12560 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45  ASSIVE, FULL, RE
12570 53 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e  START.** or TRUN
12580 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  CATE..*/.int sql
12590 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73  ite3Checkpoint(s
125a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
125b0 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20  iDb, int eMode, 
125c0 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20  int *pnLog, int 
125d0 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20  *pnCkpt){.  int 
125e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
125f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12600 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
12610 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
12640 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63  te through attac
12650 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74  hed dbs */.  int
12660 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20   bBusy = 0;     
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12680 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42  True if SQLITE_B
12690 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63  USY has been enc
126a0 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61  ountered */..  a
126b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
126c0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
126d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
126e0 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c  ( !pnLog || *pnL
126f0 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65  og==-1 );.  asse
12700 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a  rt( !pnCkpt || *
12710 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20  pnCkpt==-1 );.. 
12720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12730 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nDb && rc==SQLIT
12740 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
12750 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44  if( i==iDb || iD
12760 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  b==SQLITE_MAX_AT
12770 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20  TACHED ){.      
12780 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12790 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e  eCheckpoint(db->
127a0 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64  aDb[i].pBt, eMod
127b0 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
127c0 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d  );.      pnLog =
127d0 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74   0;.      pnCkpt
127e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
127f0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12800 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79  ){.        bBusy
12810 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
12820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12840 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
12850 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73  QLITE_OK && bBus
12860 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
12870 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20   : rc;.}.#endif 
12880 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
12890 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL */../*.** Thi
128a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
128b0 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
128c0 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
128d0 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
128e0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
128f0 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
12900 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
12910 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
12920 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
12930 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
12940 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
12950 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
12960 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
12970 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
12980 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
12990 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
129a0 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
129b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
129c0 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
129d0 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
129e0 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
129f0 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
12a00 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
12a10 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
12a20 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
12a30 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
12a40 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
12a50 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
12a60 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a80 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
12a90 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
12ae0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
12af0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
12b00 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
12b10 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
12b20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
12b30 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
12b40 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12b50 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
12b60 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
12b70 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
12b80 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
12b90 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
12bb0 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
12bc0 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
12c00 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
12c30 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
12c40 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12c70 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
12c80 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
12c90 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
12ca0 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
12cb0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
12cc0 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
12cd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
12ce0 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
12cf0 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
12d00 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
12d10 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
12d20 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
12d30 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
12d40 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
12d50 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
12d60 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
12d70 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
12d80 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
12d90 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44  TORE==3.  UNUSED
12da0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
12db0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
12dc0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
12dd0 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
12de0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
12df0 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
12e00 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
12e10 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
12e20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
12e30 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  -8 encoded Engli
12e40 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
12e50 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
12e60 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
12e70 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ror..*/.const ch
12e80 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  ar *sqlite3_errm
12e90 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sg(sqlite3 *db){
12ea0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12eb0 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
12ec0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
12ed0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
12ee0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  OMEM_BKPT);.  }.
12ef0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
12f00 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
12f10 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
12f20 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
12f30 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  r(SQLITE_MISUSE_
12f40 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  BKPT);.  }.  sql
12f50 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12f60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
12f70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12f80 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  led ){.    z = s
12f90 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
12fa0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
12fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65  .  }else{.    te
12fc0 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72  stcase( db->pErr
12fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28  ==0 );.    z = (
12fe0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
12ff0 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72  lue_text(db->pEr
13000 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
13010 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
13020 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  d );.    if( z==
13030 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  0 ){.      z = s
13040 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
13050 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d  >errCode);.    }
13060 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13070 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13080 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13090 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
130a0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
130b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
130c0 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  -16 encoded Engl
130d0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
130e0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
130f0 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
13100 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  rror..*/.const v
13110 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  oid *sqlite3_err
13120 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64  msg16(sqlite3 *d
13130 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
13140 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b  st u16 outOfMem[
13150 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27  ] = {.    'o', '
13160 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f  u', 't', ' ', 'o
13170 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27  ', 'f', ' ', 'm'
13180 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c  , 'e', 'm', 'o',
13190 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d   'r', 'y', 0.  }
131a0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
131b0 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20   u16 misuse[] = 
131c0 7b 0a 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20  {.    'b', 'a', 
131d0 27 64 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27  'd', ' ', 'p', '
131e0 61 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d  a', 'r', 'a', 'm
131f0 27 2c 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27  ', 'e', 't', 'e'
13200 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20  , 'r', ' ',.    
13210 27 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27  'o', 'r', ' ', '
13220 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65  o', 't', 'h', 'e
13230 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27  ', 'r', ' ', 'A'
13240 2c 20 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c  , 'P', 'I', ' ',
13250 0a 20 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27  .    'm', 'i', '
13260 73 27 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65  s', 'u', 's', 'e
13270 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
13280 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
13290 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
132a0 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
132b0 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
132c0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
132d0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
132e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
132f0 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
13300 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13310 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13320 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
13330 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13340 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
13350 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
13360 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
13370 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
13380 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
13390 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
133a0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
133b0 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f  sg(db, db->errCo
133c0 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  de, sqlite3ErrSt
133d0 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b  r(db->errCode));
133e0 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
133f0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
13400 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
13410 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
13420 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
13430 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
13440 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
13450 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
13460 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
13470 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
13480 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
13490 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
134a0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
134b0 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
134c0 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
134d0 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
134e0 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
134f0 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
13500 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
13510 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
13520 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
13530 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
13540 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43  .    sqlite3OomC
13550 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20  lear(db);.  }.  
13560 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13570 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
13580 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
13590 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
135a0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
135b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
135c0 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
135d0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
135e0 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
135f0 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
13600 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
13610 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
13620 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
13630 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
13640 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
13650 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
13660 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
13670 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
13680 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
13690 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
136a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
136b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
136c0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
136d0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
136e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
136f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
13700 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
13710 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26  rn db->errCode &
13720 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
13730 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
13740 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c  nded_errcode(sql
13750 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
13760 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
13770 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
13780 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
13790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
137a0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
137b0 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
137c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
137d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137e0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
137f0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
13800 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Code;.}.int sqli
13810 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  te3_system_errno
13820 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13830 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d   return db ? db-
13840 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a  >iSysErrno : 0;.
13850 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }  ../*.** Retur
13860 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
13870 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
13880 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
13890 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
138a0 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e  argument.  For n
138b0 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20  ow, this simply 
138c0 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e  calls the intern
138d0 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  al sqlite3ErrStr
138e0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ().** function..
138f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
13900 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e  qlite3_errstr(in
13910 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20  t rc){.  return 
13920 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
13930 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
13940 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
13950 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
13960 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
13970 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
13980 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
13990 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
139a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
139b0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
139c0 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f  qlite3* db,.  co
139d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
139e0 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f   .  u8 enc,.  vo
139f0 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
13a00 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
13a10 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13a20 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13a30 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
13a40 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
13a50 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
13a60 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73  nt enc2;.  .  as
13a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13a80 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13a90 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
13aa0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
13ab0 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
13ac0 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
13ad0 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
13ae0 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
13af0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
13b00 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
13b10 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
13b20 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
13b30 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
13b40 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
13b50 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
13b60 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
13b70 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
13b80 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
13b90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
13ba0 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
13bb0 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
13bc0 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
13bd0 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
13be0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
13bf0 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
13c00 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
13c10 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
13c20 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
13c30 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
13c40 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
13c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
13c60 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
13c70 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
13c80 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
13c90 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
13ca0 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
13cb0 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
13cc0 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
13cd0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
13ce0 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
13cf0 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
13d00 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
13d10 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
13d20 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
13d30 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
13d40 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
13d50 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13d60 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
13d70 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
13d80 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
13d90 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
13da0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
13db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13dc0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
13dd0 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
13de0 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
13df0 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c  elete/modify col
13e00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13e10 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
13e20 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
13e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e40 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
13e50 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
13e60 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
13e70 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
13e80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13e90 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
13ea0 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
13eb0 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
13ec0 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
13ed0 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
13ee0 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
13ef0 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
13f00 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
13f10 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
13f20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
13f30 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
13f40 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
13f50 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
13f60 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
13f70 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
13f80 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
13f90 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
13fa0 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
13fb0 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
13fc0 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
13fd0 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
13fe0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
13ff0 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
14000 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
14010 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
14020 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
14030 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
14040 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
14050 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
14060 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
14070 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
14080 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
14090 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
140a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
140b0 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
140c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
140d0 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
140e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
140f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14100 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14110 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14120 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
14130 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
14140 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
14150 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14160 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
14170 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
14180 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
14190 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
141a0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
141b0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
141c0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
141d0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
141e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
141f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14200 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14210 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
14220 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
14230 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
14240 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
14250 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
14260 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
14270 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
14280 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
14290 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
142a0 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
142b0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
142c0 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
142d0 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
142e0 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
142f0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
14300 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14310 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
14320 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
14330 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
14340 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
14350 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
14360 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
14370 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
14380 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
14390 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
143a0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
143b0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
143c0 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
143d0 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
143e0 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
143f0 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
14400 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
14410 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
14420 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
14430 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14440 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
14450 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
14460 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
14470 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
14480 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
14490 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
144a0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
144b0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
144c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
144d0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
144e0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
144f0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
14500 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
14510 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
14520 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14530 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
14540 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
14550 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14560 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
14570 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
14580 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
14590 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
145a0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
145b0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
145c0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
145d0 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
145e0 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
145f0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14600 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
14610 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
14620 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
14630 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
14640 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14650 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
14660 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
14670 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
14680 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
14690 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
146a0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
146b0 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
146c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
146d0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
146e0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
146f0 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
14700 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
14710 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
14720 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
14730 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14740 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
14750 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
14760 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
14770 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
14780 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
14790 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
147a0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
147b0 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
147c0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
147d0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
147e0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
147f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
14800 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
14810 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
14820 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
14830 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
14840 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
14850 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
14860 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
14870 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
14880 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
14890 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
148a0 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
148b0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
148c0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
148d0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
148e0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
148f0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
14900 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
14910 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
14920 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
14930 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
14940 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
14950 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
14960 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
14970 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
14980 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
14990 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
149a0 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
149b0 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
149c0 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
149d0 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
149e0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
149f0 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
14a00 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
14a10 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
14a20 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
14a30 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
14a40 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
14a50 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
14a60 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
14a70 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
14a80 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
14a90 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
14aa0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
14ab0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
14ac0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
14ad0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
14ae0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
14af0 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
14b00 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
14b10 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
14b20 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
14b30 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
14b40 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
14b50 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
14b60 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
14b70 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
14b80 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
14b90 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
14ba0 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
14bb0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
14bc0 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
14bd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
14be0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14bf0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
14c00 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
14c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14c20 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14c30 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
14c40 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
14c50 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
14c60 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14c70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
14c80 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
14c90 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
14ca0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14cb0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
14cc0 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
14cd0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
14ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14cf0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14d00 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
14d10 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
14d20 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
14d30 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
14d40 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14d50 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
14d60 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
14d70 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
14d80 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14d90 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
14da0 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
14db0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
14dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14dd0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14de0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
14df0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
14e00 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
14e10 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14e20 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
14e30 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14e70 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
14e80 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
14e90 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
14ea0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
14eb0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
14ec0 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
14ed0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
14ee0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14ef0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14f00 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
14f10 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
14f20 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
14f30 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14f40 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14f50 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
14f60 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
14f70 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
14f80 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
14f90 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
14fa0 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
14fb0 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
14fc0 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
14fd0 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
14fe0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
14ff0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15000 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
15010 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
15020 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
15030 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15040 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
15050 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
15060 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
15070 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
15080 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
15090 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
150a0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
150b0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
150c0 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
150d0 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
150e0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
150f0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15100 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15120 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
15130 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
15140 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15150 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
15160 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
15170 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
15180 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
15190 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
151a0 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
151b0 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
151c0 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
151d0 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
151e0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
151f0 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
15200 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
15210 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
15220 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15230 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
15240 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
15250 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
15260 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
15270 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
15280 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
15290 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
152a0 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
152b0 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
152c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
152d0 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
152e0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
152f0 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
15300 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
15310 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
15320 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
15330 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
15340 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
15350 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
15360 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
15370 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
15380 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
15390 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
153a0 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
153b0 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
153c0 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
153d0 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
153e0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
153f0 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
15400 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
15410 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
15420 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15430 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
15440 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
15450 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
15460 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
15470 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
15480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15490 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
154a0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
154b0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
154c0 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
154d0 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
154e0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
154f0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
15500 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
15510 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
15520 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
15530 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
15540 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
15550 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15560 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
15570 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
15580 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
15590 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
155a0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
155b0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
155c0 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
155d0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
155e0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
155f0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15600 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
15610 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15620 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
15630 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
15640 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
15650 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
15660 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
15670 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
15680 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
15690 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
156a0 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
156b0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
156c0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156e0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
156f0 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
15700 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
15710 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
15720 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
15730 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
15740 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
15750 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
15760 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
15770 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
15780 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
157b0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
157c0 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
157d0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
157e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
157f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
15800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
15810 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
15820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15830 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
15840 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
15850 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
15860 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
15870 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
15880 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
15890 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
158a0 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
158b0 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
158c0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
158d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
158e0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
158f0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
15900 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
15910 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
15920 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15930 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
15940 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
15950 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
15960 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
15970 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
15980 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
15990 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
159a0 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
159b0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
159e0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
159f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
15a20 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
15a30 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
15a40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15a50 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
15a60 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
15a70 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
15a80 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
15a90 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
15aa0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
15ab0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
15ac0 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
15ad0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
15ae0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
15af0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
15b00 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
15b10 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
15b20 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
15b30 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
15b40 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
15b50 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
15b60 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
15b70 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
15b80 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
15b90 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
15ba0 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
15bb0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
15bc0 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
15bd0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
15be0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15bf0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
15c00 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
15c10 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
15c20 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
15c30 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
15c40 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
15c50 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
15c60 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
15c70 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
15c80 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
15c90 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
15ca0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
15cb0 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
15cc0 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
15cd0 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
15ce0 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
15cf0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
15d00 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
15d10 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
15d20 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
15d30 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
15d40 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
15d50 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
15d60 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
15d70 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
15d80 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
15d90 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
15da0 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
15db0 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
15dc0 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
15dd0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
15de0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
15df0 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
15e00 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
15e10 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
15e20 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
15e30 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
15e40 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
15e50 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
15e60 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
15e70 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
15e80 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
15e90 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
15ea0 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
15eb0 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
15ec0 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
15ed0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
15ee0 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
15ef0 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
15f00 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
15f10 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
15f20 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
15f30 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
15f40 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
15f50 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
15f60 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15f70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
15f80 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
15f90 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
15fa0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
15fb0 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
15fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15fd0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
15fe0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
15ff0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16000 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16010 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
16020 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
16030 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
16040 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
16050 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
16060 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
16070 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
16080 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16090 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
160a0 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
160b0 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
160c0 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
160d0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
160e0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
160f0 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
16100 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16110 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
16120 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
16130 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
16140 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
16150 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
16160 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
16170 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
16180 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
16190 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
161a0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
161b0 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
161c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
161d0 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
161e0 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
161f0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
16200 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
16210 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
16220 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
16230 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
16240 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
16250 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
16260 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
16270 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
16280 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
16290 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
162a0 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
162b0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
162c0 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
162d0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
162e0 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
162f0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
16300 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66   octet==0 ){.#if
16310 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
16320 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a  LE_URI_00_ERROR.
16330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
16340 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
16350 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
16360 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
16370 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
16380 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
16390 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
163a0 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
163b0 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
163c0 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
163d0 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
163e0 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
163f0 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
16400 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
16410 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
16420 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
16430 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
16440 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
16450 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
16460 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
16470 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
16480 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
16490 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
164a0 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
164c0 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
164d0 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
164e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
164f0 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
16500 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
16510 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
16520 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
16530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
16540 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45           /* If E
16560 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
16570 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22  OR is defined, "
16580 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73  %00" in a URI is
16590 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
165a0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
165b0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
165c0 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20  ntf("unexpected 
165d0 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20  %%00 in uri");. 
165e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
165f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16600 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
16610 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66  _uri_out;.#endif
16620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16630 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
16640 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
16650 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
16660 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
16670 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
16680 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
16690 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
166a0 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
166b0 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
166c0 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
166d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
166e0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
166f0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
16700 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
16710 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
16720 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
16730 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
16740 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
16750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
16760 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
16770 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
16780 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
16790 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
167a0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
167b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
167c0 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
167d0 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
167e0 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
167f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
16800 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
16810 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
16820 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
16830 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
16840 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
16850 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
16860 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
16870 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
16880 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
16890 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
168a0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
168b0 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
168c0 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
168d0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
168e0 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
168f0 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
16900 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
16910 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
16920 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
16930 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
16940 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
16950 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
16960 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
16970 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
16980 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
16990 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
169a0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
169b0 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
169c0 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
169d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
169e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
169f0 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
16a00 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
16a10 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
16a20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
16a30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
16a40 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
16a50 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
16a60 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
16a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
16a80 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
16a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16aa0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
16ab0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
16ac0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
16ad0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
16ae0 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
16af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
16b00 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
16b10 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
16b20 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
16b30 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
16b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
16b50 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
16b60 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
16b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16b80 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
16b90 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
16ba0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
16bb0 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
16bc0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
16bd0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
16be0 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
16bf0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
16c00 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
16c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
16c20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
16c30 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
16c40 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
16c50 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
16c60 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
16c70 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
16c80 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
16c90 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
16ca0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
16cb0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
16cc0 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
16cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16ce0 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
16cf0 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
16d00 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
16d10 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
16d20 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
16d30 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
16d40 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
16d50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16d60 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
16d70 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
16d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16d90 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
16da0 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
16db0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16dc0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
16dd0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
16de0 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
16df0 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
16e00 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
16e10 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
16e20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
16e30 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
16e40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16e50 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
16e60 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16e90 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16ea0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
16eb0 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
16ec0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
16ed0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
16ee0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
16ef0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
16f00 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
16f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
16f20 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
16f30 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
16f40 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
16f50 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
16f60 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
16f70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
16f80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
16f90 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
16fa0 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
16fb0 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
16fc0 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
16fd0 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
16fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16ff0 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
17000 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
17010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17040 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
17050 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17060 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17070 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17080 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
17090 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
170a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
170b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
170c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
170d0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
170e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
170f0 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
17100 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
17110 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
17120 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17130 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17140 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
17150 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
17160 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17180 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
17190 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
171a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
171b0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
171c0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
171d0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
171e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
171f0 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
17200 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
17210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17220 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
17230 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
17240 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
17250 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
17260 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
17270 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
17280 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
17290 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
172a0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b  .    if( nUri ){
172b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  .      memcpy(zF
172c0 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
172d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
172e0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
172f0 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
17300 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
17310 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17320 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
17330 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
17340 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
17350 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
17360 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
17370 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17380 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
17390 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
173a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
173b0 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
173c0 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
173d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
173e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
173f0 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
17400 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
17410 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
17420 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
17430 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17440 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
17450 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
17460 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
17470 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
17480 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
17490 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
174a0 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
174b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
174c0 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
174d0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
174e0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
174f0 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
17500 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
17510 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
17520 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
17530 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
17540 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
17550 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
17560 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
17570 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
17580 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
17590 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
175a0 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
175b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
175c0 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
175d0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
175e0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
175f0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
17600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17610 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
17620 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
17630 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
17660 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
17670 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
17680 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
17690 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
176a0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
176b0 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
176c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
176d0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
176e0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
176f0 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
17700 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17720 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
17730 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
17740 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
17750 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
17760 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
17770 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
17780 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
17790 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
177a0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
177b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
177c0 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
177d0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
177e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
177f0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
17800 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
17810 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
17820 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
17830 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
17840 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
17850 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17860 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
17870 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
17880 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
17890 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
178a0 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
178b0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
178c0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
178d0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
178e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
178f0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
17900 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73    }..  if( flags
17910 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
17920 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
17930 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
17940 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
17950 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
17960 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
17970 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
17980 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
17990 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
179a0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
179b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
179c0 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
179d0 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
179e0 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
179f0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
17a00 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
17a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
17a20 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
17a30 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
17a40 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
17a50 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
17a60 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
17a70 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
17a80 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
17a90 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
17aa0 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
17ab0 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
17ac0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17ad0 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
17ae0 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
17af0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
17b00 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
17b10 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
17b20 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
17b30 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
17b40 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
17b50 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
17b60 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
17b70 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
17b80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
17b90 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
17ba0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17bb0 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
17bc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17bd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
17be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17bf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
17c00 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
17c10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17c20 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
17c30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17c40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
17c50 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
17c60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17c70 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
17c80 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
17c90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17ca0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
17cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17cc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
17cd0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17cf0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
17d00 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
17d20 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
17d30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17d40 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
17d50 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
17d60 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
17d70 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
17d80 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
17d90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
17da0 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
17db0 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
17dc0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17dd0 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
17de0 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  fe .#ifdef SQLIT
17df0 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48  E_ENABLE_MULTITH
17e00 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20 20  READED_CHECKS.  
17e10 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
17e20 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
17e30 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ex.#endif.  ){. 
17e40 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
17e50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
17e60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
17e70 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
17e80 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
17e90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
17ea0 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
17eb0 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
17ec0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17ed0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 54     }.    if( isT
17ee0 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a  hreadsafe==0 ){.
17ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
17f00 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69  exWarnOnContenti
17f10 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  on(db->mutex);. 
17f20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
17f30 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
17f40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
17f50 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
17f60 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
17f70 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
17f80 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
17f90 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
17fa0 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
17fb0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
17fc0 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
17fd0 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
17fe0 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
17ff0 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
18000 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
18010 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69  mit));.  db->aLi
18020 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
18030 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
18040 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18050 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
18060 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
18070 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
18080 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
18090 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73    db->szMmap = s
180a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
180b0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d  ig.szMmap;.  db-
180c0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
180d0 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72  0;.  db->nMaxSor
180e0 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46  terMmap = 0x7FFF
180f0 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  FFFF;.  db->flag
18100 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
18110 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
18120 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
18130 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   | SQLITE_CacheS
18140 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65  pill.#if !define
18150 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
18160 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
18170 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41  ) || SQLITE_DEFA
18180 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
18190 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
181a0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75       | SQLITE_Au
181b0 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23  toIndex.#endif.#
181c0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
181d0 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a  T_CKPTFULLFSYNC.
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75   | SQLITE_CkptFu
18200 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23  llFSync.#endif.#
18210 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18220 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
18250 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
18260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18270 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
18280 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
18290 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
182a0 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
182b0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
182c0 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
182d0 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
182e0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
182f0 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
18300 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
18310 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
18320 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
18330 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18340 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18360 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
18370 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  ys.#endif.#if de
18380 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56  fined(SQLITE_REV
18390 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53  ERSE_UNORDERED_S
183a0 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20  ELECTS).        
183b0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
183c0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23  E_ReverseOrder.#
183d0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
183e0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
183f0 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
18400 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  ECK).           
18410 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43        | SQLITE_C
18420 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66  ellSizeCk.#endif
18430 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18440 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
18450 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20  TOKENIZER).     
18460 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
18470 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a  LITE_Fts3Tokeniz
18480 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
18490 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
184a0 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20  BLE_QPSG).      
184b0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
184c0 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23  ITE_EnableQPSG.#
184d0 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
184e0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
184f0 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
18500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18510 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
18520 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
18530 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
18540 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
18550 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
18560 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18570 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
18580 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
18590 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
185a0 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
185b0 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
185c0 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
185d0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
185e0 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
185f0 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
18600 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
18610 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
18620 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
18630 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
18640 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
18650 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
18660 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
18670 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
18680 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
18690 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
186a0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
186b0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
186c0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
186d0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
186e0 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
186f0 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
18700 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
18710 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
18720 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
18730 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
18740 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
18750 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
18760 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
18770 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
18780 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
18790 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
187a0 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
187b0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
187c0 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
187d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
187e0 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
187f0 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
18800 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18810 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
18820 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a  db_out;.  }.  /*
18830 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18840 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20  08308-17224 The 
18850 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
18860 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  g function for a
18870 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  ll.  ** strings 
18880 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f  is BINARY. .  */
18890 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
188a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
188b0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
188c0 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74  _UTF8, sqlite3St
188d0 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61  rBINARY, 0);.  a
188e0 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
188f0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
18900 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
18910 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
18920 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20  .  **.  ** Only 
18930 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
18940 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
18950 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
18960 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
18970 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
18980 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
18990 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
189a0 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
189b0 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
189c0 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
189d0 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
189e0 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
189f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
18a00 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
18a10 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
18a20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
18a30 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
18a40 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
18a50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
18a60 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
18a70 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
18a80 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
18a90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
18aa0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18ab0 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  .  */.  db->open
18ac0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
18ad0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
18ae0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
18af0 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
18b00 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
18b10 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
18b20 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
18b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18b40 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
18b50 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
18b60 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
18b70 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
18b80 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
18b90 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
18ba0 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
18bb0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
18bc0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
18bd0 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
18be0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
18bf0 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
18c00 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
18c10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
18c20 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
18c30 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
18c40 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
18c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
18c60 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
18c70 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
18c80 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
18c90 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
18ca0 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66  rrMsg);.  }.  if
18cb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18cc0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
18cd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71  QLITE_NOMEM ) sq
18ce0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
18cf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
18d00 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
18d10 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
18d20 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
18d30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18d40 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
18d50 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18d60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
18d70 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
18d80 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
18d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18da0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
18db0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
18dc0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
18df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18e00 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
18e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18e30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
18e40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18e50 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18e60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
18e70 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
18e80 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18e90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18ea0 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
18eb0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
18ec0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
18ed0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
18ee0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
18ef0 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
18f00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18f10 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
18f20 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
18f30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18f40 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
18f50 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
18f60 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
18f70 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
18f80 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
18f90 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
18fa0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
18fb0 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66  abase is FULL; f
18fc0 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
18fd0 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
18fe0 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65  OFF. This matche
18ff0 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
19000 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
19010 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
19020 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  zDbSName = "main
19030 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
19040 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53  safety_level = S
19050 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
19060 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64  NCHRONOUS+1;.  d
19070 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61  b->aDb[1].zDbSNa
19080 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
19090 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
190a0 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53  _level = PAGER_S
190b0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a  YNCHRONOUS_OFF;.
190c0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
190d0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
190e0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
190f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19100 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
19120 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
19130 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
19140 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
19150 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
19160 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
19170 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
19180 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
19190 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
191a0 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
191b0 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
191c0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
191d0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
191e0 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
191f0 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
19200 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
19210 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19220 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69  errcode(db);..#i
19230 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19240 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67  LE_FTS5.  /* Reg
19250 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d  ister any built-
19260 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62  in FTS5 module b
19270 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68  efore loading th
19280 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a  e automatic.  **
19290 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69   extensions. Thi
192a0 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74  s allows automat
192b0 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f  ic extensions to
192c0 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20 0a   register FTS5 .
192d0 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20    ** tokenizers 
192e0 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66 75  and auxiliary fu
192f0 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69  nctions.  */.  i
19300 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19310 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
19320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19330 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69  = sqlite3Fts5Ini
19340 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
19350 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  f..  /* Load aut
19360 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
19370 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
19380 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
19390 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
193a0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
193b0 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
193c0 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
193d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
193e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
193f0 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
19400 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
19410 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
19420 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
19430 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19440 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
19450 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
19460 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19470 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
19480 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19490 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
194a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
194b0 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
194c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
194d0 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
194e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
194f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19500 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
19510 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
19520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19530 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
19540 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
19550 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
19560 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
19570 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
19580 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
19590 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
195a0 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
195b0 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
195c0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
195d0 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
195e0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
195f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
19610 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
19620 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
19630 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19640 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65  E_ICU) || define
19650 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
19660 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a  ICU_COLLATIONS).
19670 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
19680 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
19690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
196a0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
196b0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
196c0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
196d0 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
196e0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
196f0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
19700 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
19710 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
19720 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
19730 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
19740 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
19750 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  E_VTAB.  if( !db
19760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
19770 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
19780 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19790 65 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72  e3DbpageRegister
197a0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
197b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
197c0 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54  ENABLE_DBSTAT_VT
197d0 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
197e0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
197f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
19800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62    rc = sqlite3Db
19810 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
19820 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
19830 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19840 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21  LE_JSON1.  if( !
19850 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19860 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
19870 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
19880 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62  ite3Json1Init(db
19890 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
198a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
198b0 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69  BLE_STMTVTAB.  i
198c0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
198d0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
198e0 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
198f0 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62   sqlite3StmtVtab
19900 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
19910 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
19920 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
19930 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
19940 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
19950 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
19960 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
19970 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
19980 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
19990 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
199a0 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
199b0 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
199c0 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
199d0 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
199e0 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
199f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19a00 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
19a10 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
19a20 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
19a30 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
19a40 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
19a50 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
19a60 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
19a70 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
19a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19a90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
19aa0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
19ab0 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
19ac0 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
19ad0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
19ae0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  );..  /* Enable 
19af0 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
19b00 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
19b10 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
19b20 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
19b30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
19b40 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19b70 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
19b80 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
19b90 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
19ba0 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
19bb0 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
19bc0 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
19bd0 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20  b_out:.  if( db 
19be0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
19bf0 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
19c00 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20  sThreadsafe==0. 
19c10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
19c20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19c30 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
19c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
19c50 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19c60 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
19c70 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
19c80 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
19c90 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
19ca0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
19cb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
19cc0 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
19cd0 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
19ce0 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
19cf0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
19d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
19d10 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
19d20 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
19d30 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
19d40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19d50 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
19d60 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19d70 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
19d80 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
19d90 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
19da0 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
19db0 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
19dc0 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
19dd0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
19de0 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
19df0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19e00 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
19e10 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
19e20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  0);.  }.#endif.#
19e30 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19e40 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69  E_HAS_CODEC).  i
19e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19e60 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
19e70 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66  ar *zKey;.    if
19e80 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ( (zKey = sqlite
19e90 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
19ea0 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29  zOpen, "hexkey")
19eb0 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20  )!=0 && zKey[0] 
19ec0 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  ){.      u8 iByt
19ed0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
19ee0 20 20 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f        char zDeco
19ef0 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  ded[40];.      f
19f00 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
19f10 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
19f20 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
19f30 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
19f40 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
19f50 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
19f60 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
19f70 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a  ToInt(zKey[i]);.
19f80 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
19f90 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b  )!=0 ) zDecoded[
19fa0 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
19fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
19fc0 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
19fd0 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29  , zDecoded, i/2)
19fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19ff0 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1a000 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1a010 70 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20  pen, "key"))!=0 
1a020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a030 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a  _key_v2(db, 0, z
1a040 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  Key, sqlite3Strl
1a050 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20  en30(zKey));.   
1a060 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1a070 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
1a080 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
1a090 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
1a0a0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1a0b0 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1a0c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1a0d0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
1a0e0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
1a0f0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
1a100 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
1a110 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
1a120 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a140 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a150 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a160 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
1a170 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1a180 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
1a190 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
1a1a0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1a1b0 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
1a1c0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1a1d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1a1e0 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
1a1f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
1a200 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1a210 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
1a220 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
1a230 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a240 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
1a250 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
1a260 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
1a270 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
1a280 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
1a290 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
1a2a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a2b0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
1a2c0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1a2d0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
1a2e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
1a2f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1a300 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1a310 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
1a320 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
1a330 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
1a340 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
1a350 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
1a360 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
1a370 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1a380 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
1a390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a3a0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a3b0 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
1a3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1a3d0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1a3e0 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
1a3f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a400 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
1a410 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
1a420 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
1a430 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
1a440 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
1a450 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
1a460 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
1a470 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
1a480 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
1a490 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
1a4a0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
1a4b0 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
1a4c0 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
1a4d0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
1a4e0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
1a4f0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
1a500 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
1a510 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1a520 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
1a530 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
1a540 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1a570 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1a580 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
1a590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
1a5a0 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
1a5b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
1a5c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a5d0 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
1a5e0 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
1a5f0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
1a600 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
1a610 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
1a620 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
1a630 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
1a640 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a660 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  M_BKPT;.  }.  sq
1a670 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
1a680 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
1a690 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e  rc & 0xff;.}.#en
1a6a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a6b0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1a6c0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1a6d0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1a6e0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1a6f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1a700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a710 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1a720 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
1a730 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1a740 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1a750 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1a760 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1a770 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1a780 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1a790 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1a7a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
1a7b0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
1a7c0 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e  v2(db, zName, en
1a7d0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
1a7e0 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, 0);.}../*.** 
1a7f0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1a800 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a810 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1a820 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1a830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1a840 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1a850 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
1a860 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1a870 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1a880 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1a890 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1a8a0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1a8b0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1a8c0 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
1a8d0 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
1a8e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
1a8f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a900 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a910 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a920 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1a930 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
1a940 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a950 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a960 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a970 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a980 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
1a990 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a9a0 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
1a9b0 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
1a9c0 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
1a9d0 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
1a9e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1a9f0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1aa00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1aa10 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1aa20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1aa30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1aa40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1aa50 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1aa60 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1aa70 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1aa80 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1aa90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1aaa0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1aab0 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
1aac0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
1aad0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
1aae0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1aaf0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1ab00 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1ab10 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1ab20 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1ab30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ab40 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
1ab50 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e8;..#ifdef SQLI
1ab60 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1ab70 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1ab80 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1ab90 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
1aba0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1abb0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1abc0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1abd0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1abe0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1abf0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1ac00 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
1ac10 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
1ac20 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
1ac30 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
1ac40 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
1ac50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
1ac60 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
1ac70 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
1ac80 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1ac90 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1aca0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1acb0 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
1acc0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1acd0 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1ace0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1acf0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1ad00 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1ad10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1ad20 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
1ad30 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
1ad40 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1ad50 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
1ad60 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1ad70 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
1ad80 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
1ad90 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
1ada0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1adb0 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
1adc0 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
1add0 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
1ade0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
1adf0 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
1ae00 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
1ae10 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
1ae20 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1ae30 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
1ae40 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1ae50 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1ae60 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1ae70 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1ae80 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1ae90 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1aea0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1aeb0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1aec0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1aed0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
1aee0 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
1aef0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1af00 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
1af10 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1af20 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1af30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1af40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1af50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1af60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1af70 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1af80 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1af90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1afa0 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1afb0 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1afc0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1afd0 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1afe0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1aff0 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1b000 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1b010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b020 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1b030 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
1b040 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
1b050 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
1b060 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
1b070 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
1b080 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
1b090 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1b0a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b0b0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b0c0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b0d0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1b0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b0f0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b100 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b110 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b120 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
1b130 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
1b140 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1b150 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
1b160 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
1b170 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
1b180 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
1b190 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b1a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b1b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b1c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b1d0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1b1e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b1f0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1b200 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b210 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61  on is now an ana
1b220 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65  chronism. It use
1b230 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20  d to be used to 
1b240 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a  recover from a.*
1b250 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  * malloc() failu
1b260 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e  re, but SQLite n
1b270 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74  ow does this aut
1b280 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69  omatically..*/.i
1b290 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  nt sqlite3_globa
1b2a0 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b  l_recover(void){
1b2b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b2c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
1b2d0 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
1b2e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1b2f0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1b300 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
1b310 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
1b320 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1b330 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
1b340 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
1b350 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
1b360 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
1b370 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
1b380 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
1b390 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
1b3a0 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
1b3b0 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
1b3c0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f   or ROLLBACK..*/
1b3d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
1b3e0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
1b3f0 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
1b400 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1b410 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1b420 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1b430 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1b440 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1b450 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1b460 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1b470 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
1b480 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
1b490 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1b4a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
1b4b0 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20  substitutes for 
1b4c0 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
1b4d0 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
1b4e0 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
1b4f0 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
1b500 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f  ITE_NOMEM and po
1b510 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
1b520 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
1b530 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f    They serve two
1b540 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
1b550 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
1b560 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1b570 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1b580 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
1b590 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
1b5a0 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
1b5b0 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
1b5c0 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
1b5d0 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
1b5e0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
1b5f0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
1b600 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
1b610 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
1b620 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
1b630 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
1b640 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ected..*/.int sq
1b650 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1b660 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c  (int iErr, int l
1b670 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
1b680 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c  r *zType){.  sql
1b690 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22  ite3_log(iErr, "
1b6a0 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  %s at line %d of
1b6b0 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
1b6c0 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20           zType, 
1b6d0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1b6e0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1b6f0 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d    return iErr;.}
1b700 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1b710 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
1b720 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1b730 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1b740 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1b750 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1b760 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1b770 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1b780 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63  eno, "database c
1b790 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69  orruption");.}.i
1b7a0 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
1b7b0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1b7c0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1b7d0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b7e0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1b7f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1b800 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1b810 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c  _MISUSE, lineno,
1b820 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e   "misuse");.}.in
1b830 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
1b840 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
1b850 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1b860 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b870 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1b880 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1b890 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1b8a0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65  E_CANTOPEN, line
1b8b0 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  no, "cannot open
1b8c0 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65   file");.}.#ifde
1b8d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
1b8e0 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1b8f0 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c  tPgnoError(int l
1b900 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f  ineno, Pgno pgno
1b910 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31  ){.  char zMsg[1
1b920 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
1b930 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1b940 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74  Msg), zMsg, "dat
1b950 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1b960 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29   page %d", pgno)
1b970 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  ;.  testcase( sq
1b980 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b990 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1b9a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1b9b0 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1b9c0 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c  CORRUPT, lineno,
1b9d0 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71   zMsg);.}.int sq
1b9e0 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28  lite3NomemError(
1b9f0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1ba00 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1ba10 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1ba20 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1ba30 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1ba40 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ror(SQLITE_NOMEM
1ba50 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29  , lineno, "OOM")
1ba60 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  ;.}.int sqlite3I
1ba70 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69  oerrnomemError(i
1ba80 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1ba90 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1baa0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1bab0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1bac0 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1bad0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1bae0 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22  NOMEM, lineno, "
1baf0 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b  I/O OOM error");
1bb00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1bb10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1bb20 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1bb30 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
1bb40 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
1bb50 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
1bb60 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
1bb70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
1bb80 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
1bb90 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
1bba0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
1bbb0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
1bbc0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1bbd0 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
1bbe0 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
1bbf0 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
1bc00 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
1bc10 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
1bc20 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
1bc30 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
1bc40 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
1bc50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1bc60 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
1bc70 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
1bc80 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
1bc90 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
1bca0 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
1bcb0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
1bcc0 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
1bcd0 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  details..*/.int 
1bce0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
1bcf0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
1bd00 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
1bd30 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1bd40 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
1bd50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
1bd60 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
1bd70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1bd80 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
1bd90 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
1bda0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1bdb0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
1bdc0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1bdd0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
1bde0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
1bdf0 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
1be00 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
1be10 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
1be20 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
1be30 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
1be40 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
1be50 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
1be60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1be70 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1be80 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
1be90 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
1bea0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
1beb0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1bec0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1bed0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
1bee0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
1bef0 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
1bf00 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1bf10 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
1bf20 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
1bf30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1bf40 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1bf50 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
1bf60 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
1bf70 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
1bf80 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68  t iCol = 0;.  ch
1bf90 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
1bfa0 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
1bfb0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
1bfc0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
1bfd0 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
1bfe0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
1bff0 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
1c000 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
1c010 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1c020 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1c030 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1c040 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d  ) || zTableName=
1c050 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c060 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1c070 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1c080 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
1c090 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1c0a0 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
1c0b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1c0c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1c0d0 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
1c0e0 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
1c0f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c100 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
1c110 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
1c120 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
1c130 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c140 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
1c150 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
1c160 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
1c170 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1c180 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
1c190 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
1c1a0 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
1c1b0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c1c0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
1c1d0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c1e0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
1c1f0 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
1c200 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
1c210 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
1c220 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
1c230 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
1c240 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
1c250 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
1c260 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
1c270 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
1c280 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1c290 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
1c2a0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
1c2b0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1c2c0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
1c2d0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
1c2e0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1c2f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c300 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
1c310 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
1c320 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
1c330 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
1c340 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
1c350 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1c360 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
1c370 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
1c380 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
1c390 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1c3a0 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
1c3b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
1c3c0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
1c3d0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1c3e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c3f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1c400 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
1c410 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
1c420 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
1c430 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
1c440 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
1c450 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
1c460 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
1c470 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
1c480 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
1c490 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
1c4a0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
1c4b0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
1c4c0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
1c4d0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
1c4e0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
1c4f0 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
1c500 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
1c510 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
1c520 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1c530 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1c540 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
1c550 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
1c560 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
1c570 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
1c580 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
1c590 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
1c5a0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
1c5b0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
1c5c0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
1c5d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1c5e0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
1c5f0 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
1c600 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69  zDataType = sqli
1c610 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
1c620 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ol,0);.    zColl
1c630 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
1c640 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
1c650 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
1c660 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
1c670 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46  y  = (pCol->colF
1c680 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
1c690 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20  RIMKEY)!=0;.    
1c6a0 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
1c6b0 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
1c6c0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1c6d0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
1c6e0 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
1c6f0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1c700 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
1c710 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
1c720 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
1c730 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
1c740 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  eq = sqlite3StrB
1c750 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f  INARY;.  }..erro
1c760 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1c770 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1c780 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1c790 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1c7a0 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1c7b0 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1c7c0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1c7d0 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1c7e0 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1c7f0 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1c800 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1c810 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1c820 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1c830 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1c840 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1c850 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1c860 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1c870 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1c880 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1c890 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1c8a0 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1c8b0 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1c8c0 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1c8d0 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1c8e0 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1c8f0 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1c900 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1c910 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1c920 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1c930 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1c940 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1c950 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c960 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1c970 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1c980 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1c990 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1c9a0 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1c9b0 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1c9c0 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1c9d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1c9e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1c9f0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1ca00 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1ca10 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1ca20 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1ca30 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1ca40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ca50 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1ca60 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ca70 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1ca80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ca90 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
1caa0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1cab0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1cac0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1cad0 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
1cae0 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
1caf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1cb00 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
1cb10 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1cb20 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1cb30 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1cb40 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1cb50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1cb60 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1cb70 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1cb80 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1cb90 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1cba0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1cbb0 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1cbc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1cbd0 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1cbe0 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1cbf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cc00 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1cc10 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1cc20 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1cc30 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1cc40 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1cc50 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1cc60 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1cc70 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1cc80 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1cc90 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1cca0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ccb0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1ccc0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1ccd0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1cce0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1ccf0 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1cd00 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1cd10 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1cd20 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1cd30 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1cd40 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1cd50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cd60 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1cd70 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1cd80 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1cd90 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1cda0 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1cdb0 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1cdc0 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1cdd0 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1cde0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1cdf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ce00 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1ce10 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1ce20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1ce30 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1ce40 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1ce50 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1ce60 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ce70 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1ce80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ce90 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1cea0 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1ceb0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1cec0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1ced0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1cee0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1cef0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1cf00 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1cf10 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1cf20 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1cf30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1cf40 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1cf50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1cf60 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1cf70 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1cf80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1cf90 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1cfa0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1cfb0 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1cfc0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1cfd0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1cfe0 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1cff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d000 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1d010 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46  =SQLITE_FCNTL_VF
1d020 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  S_POINTER ){.   
1d030 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73     *(sqlite3_vfs
1d040 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1d050 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72  3PagerVfs(pPager
1d060 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1d070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1d080 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1d090 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f  E_FCNTL_JOURNAL_
1d0a0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1d0b0 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1d0c0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1d0d0 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50  PagerJrnlFile(pP
1d0e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1d0f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d110 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1d120 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1d130 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pArg);.    }.   
1d140 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1d150 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1d160 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d170 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1d180 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d190 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
1d1a0 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
1d1b0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
1d1c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d1d0 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
1d1e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
1d1f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
1d200 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53 45  TESTABLE.  UNUSE
1d210 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b  D_PARAMETER(op);
1d220 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74  .#else.  va_list
1d230 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1d240 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
1d250 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
1d260 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
1d270 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1d280 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
1d290 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d2a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1d2b0 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
1d2c0 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
1d2d0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1d2e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d2f0 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
1d300 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1d310 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
1d320 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
1d330 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
1d340 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
1d350 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
1d360 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
1d370 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
1d380 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
1d390 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
1d3a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1d3b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1d3c0 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
1d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1d3e0 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
1d3f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d400 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1d410 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
1d420 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
1d430 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
1d440 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
1d450 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
1d460 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
1d470 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
1d480 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
1d490 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
1d4a0 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
1d4b0 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
1d4c0 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
1d4d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d4e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1d4f0 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
1d500 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1d510 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20  ness(0,0);.     
1d520 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d530 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1d540 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d550 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
1d560 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
1d570 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
1d580 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
1d590 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
1d5a0 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
1d5b0 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
1d5c0 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
1d5d0 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
1d5e0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
1d5f0 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
1d600 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
1d610 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
1d620 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
1d630 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
1d640 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
1d650 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
1d660 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
1d670 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
1d680 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1d690 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
1d6a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d6b0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
1d6c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
1d6d0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1d6e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
1d6f0 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
1d700 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
1d710 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
1d720 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
1d730 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
1d740 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d750 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1d760 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46  3_test_control(F
1d770 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43  AULT_INSTALL, xC
1d780 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a  allback).    **.
1d790 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74      ** Arrange t
1d7a0 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61  o invoke xCallba
1d7b0 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71  ck() whenever sq
1d7c0 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20  lite3FaultSim() 
1d7d0 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a  is called,.    *
1d7e0 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69  * if xCallback i
1d7f0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
1d800 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74  **.    ** As a t
1d810 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74  est of the fault
1d820 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61   simulator mecha
1d830 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c  nism itself, sql
1d840 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a  ite3FaultSim(0).
1d850 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64      ** is called
1d860 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
1d870 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68  er installing th
1d880 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61  e new callback a
1d890 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20  nd the return.  
1d8a0 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20    ** value from 
1d8b0 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1d8c0 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72  0) becomes the r
1d8d0 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a  eturn from.    *
1d8e0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1d8f0 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f  ontrol()..    */
1d900 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d910 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
1d920 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20  INSTALL: {.     
1d930 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
1d940 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
1d950 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
1d960 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
1d970 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
1d980 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
1d990 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
1d9a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d9b0 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1d9c0 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1d9d0 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20  int(*)(int));.  
1d9e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70      */.      typ
1d9f0 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41  edef int(*TESTCA
1da00 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e  LLBACKFUNC_t)(in
1da10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1da20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54  3GlobalConfig.xT
1da30 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61  estCallback = va
1da40 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c  _arg(ap, TESTCAL
1da50 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20  LBACKFUNC_t);.  
1da60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1da70 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20  FaultSim(0);.   
1da80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1da90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1daa0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1dab0 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c  trol(BENIGN_MALL
1dac0 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e  OC_HOOKS, xBegin
1dad0 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20  , xEnd).    **. 
1dae0 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68     ** Register h
1daf0 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20  ooks to call to 
1db00 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d  indicate which m
1db10 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73  alloc() failures
1db20 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e   .    ** are ben
1db30 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ign..    */.    
1db40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1db50 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
1db60 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20  OC_HOOKS: {.    
1db70 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1db80 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28  *void_function)(
1db90 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69  void);.      voi
1dba0 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
1dbb0 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76  gnBegin;.      v
1dbc0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1dbd0 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78  nignEnd;.      x
1dbe0 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61  BenignBegin = va
1dbf0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1dc00 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78  nction);.      x
1dc10 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61  BenignEnd = va_a
1dc20 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
1dc30 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  tion);.      sql
1dc40 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  ite3BenignMalloc
1dc50 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67  Hooks(xBenignBeg
1dc60 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b  in, xBenignEnd);
1dc70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1dc80 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1dc90 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1dca0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dcb0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1dcc0 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20  _BYTE, unsigned 
1dcd0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1dce0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e    ** Set the PEN
1dcf0 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65  DING byte to the
1dd00 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
1dd10 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a  gument, if X>0..
1dd20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63      ** Make no c
1dd30 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20  hanges if X==0. 
1dd40 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
1dd50 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
1dd60 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20   byte.    ** as 
1dd70 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f  it existing befo
1dd80 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1dd90 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
1dda0 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54  **.    ** IMPORT
1ddb0 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74  ANT:  Changing t
1ddc0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1ddd0 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20  from 0x40000000 
1dde0 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a  results in.    *
1ddf0 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  * an incompatibl
1de00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1de10 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e  format.  Changin
1de20 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1de30 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  te.    ** while 
1de40 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e  any database con
1de50 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  nection is open 
1de60 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66  results in undef
1de70 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ined and.    ** 
1de80 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61  deleterious beha
1de90 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vior..    */.   
1dea0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1deb0 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
1dec0 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  TE: {.      rc =
1ded0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23   PENDING_BYTE;.#
1dee0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1def0 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20  IT_WSD.      {. 
1df00 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
1df10 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
1df20 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
1df30 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
1df40 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69  f( newVal ) sqli
1df50 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d  te3PendingByte =
1df60 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d   newVal;.      }
1df70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
1df80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1df90 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1dfa0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1dfb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1dfc0 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
1dfd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1dfe0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1dff0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1e000 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
1e010 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
1e020 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
1e030 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
1e040 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
1e050 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
1e060 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
1e070 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1e080 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
1e090 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
1e0a0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
1e0b0 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1e0c0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
1e0d0 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
1e0e0 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
1e0f0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
1e100 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
1e110 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
1e120 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
1e130 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1e140 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
1e150 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
1e160 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1e170 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
1e180 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1e190 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1e1a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e1b0 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
1e1c0 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
1e1d0 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
1e1e0 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65  assert( /*side-e
1e1f0 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d  ffects-ok*/ (x =
1e200 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
1e210 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
1e220 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
1e230 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1e240 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1e250 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1e260 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1e270 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
1e280 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1e290 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1e2a0 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1e2b0 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
1e2c0 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
1e2d0 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
1e2e0 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
1e2f0 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
1e300 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1e310 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
1e320 57 41 59 53 28 58 29 20 69 66 20 58 20 69 73 20  WAYS(X) if X is 
1e330 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58 20  true, or 0 if X 
1e340 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1e350 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1e360 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1e370 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1e380 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1e390 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1e3a0 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1e3b0 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1e3c0 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1e3d0 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1e3e0 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1e3f0 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1e400 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1e410 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1e420 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1e430 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1e440 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1e450 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1e460 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1e470 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1e480 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1e490 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1e4a0 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1e4b0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1e4c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e4d0 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1e4e0 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1e4f0 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1e500 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1e510 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1e520 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1e530 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1e540 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1e550 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1e560 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1e570 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1e580 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1e590 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e5a0 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1e5b0 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1e5c0 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1e5d0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1e5e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1e5f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e600 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e610 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1e620 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1e630 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1e640 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1e650 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1e660 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1e670 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1e680 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e690 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e6a0 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1e6b0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1e6c0 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1e6d0 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1e6e0 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1e6f0 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1e700 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1e710 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1e720 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1e730 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1e740 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1e750 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1e760 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e770 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1e780 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1e790 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1e7a0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1e7b0 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29 20  = x ? ALWAYS(x) 
1e7c0 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  : 0;.      break
1e7d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1e7e0 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33      **   sqlite3
1e7f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1e800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1e810 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a  TEORDER);.    **
1e820 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65  .    ** The inte
1e830 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76  ger returned rev
1e840 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72  eals the byte-or
1e850 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75  der of the compu
1e860 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  ter on which.   
1e870 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75   ** SQLite is ru
1e880 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20  nning:.    **.  
1e890 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20    **       1    
1e8a0 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1e8b0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1e8c0 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20  n-time.    **   
1e8d0 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65     10     little
1e8e0 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69  -endian, determi
1e8f0 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1e900 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20      **  432101  
1e910 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1e920 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1e930 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1e940 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20   **  123410     
1e950 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
1e960 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1e970 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f  pile-time.    */
1e980 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54   .    case SQLIT
1e990 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1e9a0 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  RDER: {.      rc
1e9b0 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52   = SQLITE_BYTEOR
1e9c0 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45  DER*100 + SQLITE
1e9d0 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30  _LITTLEENDIAN*10
1e9e0 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44   + SQLITE_BIGEND
1e9f0 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IAN;.      break
1ea00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ea10 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ea20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ea30 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
1ea40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1ea50 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1ea60 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72  * Set the nReser
1ea70 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72  ve size to N for
1ea80 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1ea90 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  se on the databa
1eaa0 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63  se.    ** connec
1eab0 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a  tion db..    */.
1eac0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ead0 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1eae0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1eaf0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1eb00 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1eb10 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1eb20 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1eb30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1eb40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1eb50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1eb60 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
1eb70 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
1eb80 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, x, 0);.      
1eb90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1eba0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1ebb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ebc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1ebd0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ebe0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ebf0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
1ec00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1ec10 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1ec20 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1ec30 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ble various opti
1ec40 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65  mizations for te
1ec50 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
1ec60 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67   The .    ** arg
1ec70 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74  ument N is a bit
1ec80 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61  mask of optimiza
1ec90 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61  tions to be disa
1eca0 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61  bled.  For norma
1ecb0 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  l.    ** operati
1ecc0 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30  on N should be 0
1ecd0 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74  .  The idea is t
1ece0 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72  hat a test progr
1ecf0 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20  am (like the.   
1ed00 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65   ** SQL Logic Te
1ed10 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d  st or SLT test m
1ed20 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74  odule) can run t
1ed30 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74  he same SQL mult
1ed40 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a  iple times.    *
1ed50 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f  * with various o
1ed60 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73  ptimizations dis
1ed70 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20  abled to verify 
1ed80 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
1ed90 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f  swer.    ** is o
1eda0 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79  btained in every
1edb0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1edc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1edd0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1ede0 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  IONS: {.      sq
1edf0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1ee00 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1ee10 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70  ;.      db->dbOp
1ee20 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76  tFlags = (u16)(v
1ee30 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26  a_arg(ap, int) &
1ee40 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20   0xffff);.      
1ee50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ee60 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1ee70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ee80 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1ee90 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
1eea0 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
1eeb0 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
1eec0 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
1eed0 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
1eee0 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
1eef0 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
1ef00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1ef10 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
1ef20 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
1ef30 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
1ef40 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
1ef50 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
1ef60 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ef70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ef80 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
1ef90 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1efa0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
1efb0 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
1efc0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1efd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1efe0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1eff0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f000 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f010 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1f020 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1f030 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1f040 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1f050 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1f060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f070 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1f080 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1f090 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1f0a0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1f0b0 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1f0c0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1f0d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1f0e0 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1f0f0 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1f100 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1f110 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1f120 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1f130 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1f140 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1f150 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1f160 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1f170 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1f180 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1f190 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1f1a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1f1b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1f1c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1f1d0 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1f1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1f1f0 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43  balConfig.neverC
1f200 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28  orrupt = va_arg(
1f210 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1f220 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f230 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68 72    /* Set the thr
1f240 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68 20  eshold at which 
1f250 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73  OP_Once counters
1f260 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20 7a   reset back to z
1f270 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64  ero..    ** By d
1f280 65 66 61 75 6c 74 20 74 68 69 73 20 69 73 20 30  efault this is 0
1f290 78 37 66 66 66 66 66 66 65 20 28 6f 76 65 72 20  x7ffffffe (over 
1f2a0 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20  2 billion), but 
1f2b0 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20 20  that value is.  
1f2c0 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20    ** too big to 
1f2d0 74 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f 6e  test in a reason
1f2e0 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74  able amount of t
1f2f0 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e  ime, so this con
1f300 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70  trol is.    ** p
1f310 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20 61  rovided to set a
1f320 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c   small and easil
1f330 79 20 72 65 61 63 68 61 62 6c 65 20 72 65 73 65  y reachable rese
1f340 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  t value..    */.
1f350 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f360 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45  TESTCTRL_ONCE_RE
1f370 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b  SET_THRESHOLD: {
1f380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1f390 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65  obalConfig.iOnce
1f3a0 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20 3d  ResetThreshold =
1f3b0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1f3c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f3d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1f3e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f3f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f400 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
1f410 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74  E, xCallback, pt
1f420 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r);.    **.    *
1f430 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63  * Set the VDBE c
1f440 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b  overage callback
1f450 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61   function to xCa
1f460 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74  llback with cont
1f470 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ext .    ** poin
1f480 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a  ter ptr..    */.
1f490 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f4a0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1f4b0 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66  VERAGE: {.#ifdef
1f4c0 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1f4d0 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65  ERAGE.      type
1f4e0 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63  def void (*branc
1f4f0 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  h_callback)(void
1f500 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20  *,int,u8,u8);.  
1f510 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1f520 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61  lConfig.xVdbeBra
1f530 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  nch = va_arg(ap,
1f540 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1f550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1f560 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1f570 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f  eBranchArg = va_
1f580 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23  arg(ap,void*);.#
1f590 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1f5a0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f5b0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1f5c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f5d0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
1f5e0 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20  MAP, db, nMax); 
1f5f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f600 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1f610 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
1f620 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1f630 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1f640 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  3*);.      db->n
1f650 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
1f660 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1f670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f680 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1f690 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1f6a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1f6b0 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20  RL_ISINIT);.    
1f6c0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
1f6d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51   SQLITE_OK if SQ
1f6e0 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e  Lite has been in
1f6f0 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51  itialized and SQ
1f700 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20  LITE_ERROR if.  
1f710 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f    ** not..    */
1f720 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f730 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1f740 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
1f750 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f760 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63  g.isInit==0 ) rc
1f770 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1f780 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f790 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1f7a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f7b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f7c0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
1f7d0 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  dbName, onOff, t
1f7e0 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  num);.    **.   
1f7f0 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
1f800 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f  ntrol is used to
1f810 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72   create imposter
1f820 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69   tables.  "db" i
1f830 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  s a pointer.    
1f840 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1f850 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
1f860 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61  dbName is the da
1f870 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a  tabase name (ex:
1f880 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a   "main" or.    *
1f890 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20  * "temp") which 
1f8a0 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65  will receive the
1f8b0 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f   imposter.  "onO
1f8c0 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74  ff" turns impost
1f8d0 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a  er mode on.    *
1f8e0 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d  * or off.  "tnum
1f8f0 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  " is the root pa
1f900 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
1f910 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d   to which the im
1f920 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  poster.    ** ta
1f930 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65  ble should conne
1f940 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
1f950 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65  * Enable imposte
1f960 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e  r mode only when
1f970 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
1f980 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72  already been par
1f990 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a  sed.  Then.    *
1f9a0 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43  * run a single C
1f9b0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1f9c0 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75  ement to constru
1f9d0 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  ct the imposter 
1f9e0 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20  table in.    ** 
1f9f0 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d  the parsed schem
1fa00 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d  a.  Then turn im
1fa10 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b  poster mode back
1fa20 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20   off again..    
1fa30 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f  **.    ** If onO
1fa40 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30  ff==0 and tnum>0
1fa50 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1fa60 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64  schema for all d
1fa70 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e  atabases, causin
1fa80 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  g.    ** the sch
1fa90 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73  ema to be repars
1faa0 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
1fab0 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20   it is needed.  
1fac0 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20  This has the.   
1fad0 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72   ** effect of er
1fae0 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74  asing all impost
1faf0 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  er tables..    *
1fb00 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1fb10 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1fb20 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
1fb30 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1fb40 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1fb50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1fb60 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1fb70 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d  utex);.      db-
1fb80 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69  >init.iDb = sqli
1fb90 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
1fba0 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73  , va_arg(ap,cons
1fbb0 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
1fbc0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
1fbd0 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74   db->init.impost
1fbe0 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67  erTable = va_arg
1fbf0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1fc00 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1fc10 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1fc20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1fc30 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26  >init.busy==0 &&
1fc40 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1fc50 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  m>0 ){.        s
1fc60 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
1fc70 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
1fc80 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n(db);.      }. 
1fc90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1fca0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1fcb0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1fcc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
1fcd0 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
1fce0 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
1fcf0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1fd00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
1fd10 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 46  RSER_COVERAGE, F
1fd20 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20 20 2a 2a  ILE *out).    **
1fd30 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
1fd40 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c 79 20  t control (only 
1fd50 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 53  available when S
1fd60 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
1fd70 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 2d 44  d with.    ** -D
1fd80 59 59 43 4f 56 45 52 41 47 45 29 20 77 72 69 74  YYCOVERAGE) writ
1fd90 65 73 20 61 20 72 65 70 6f 72 74 20 6f 6e 74 6f  es a report onto
1fda0 20 22 6f 75 74 22 20 74 68 61 74 20 73 68 6f 77   "out" that show
1fdb0 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 61  s all.    ** sta
1fdc0 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d  te/lookahead com
1fdd0 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20 74 68 65  binations in the
1fde0 20 70 61 72 73 65 72 20 73 74 61 74 65 20 6d 61   parser state ma
1fdf0 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20 77 68 69  chine.    ** whi
1fe00 63 68 20 61 72 65 20 6e 65 76 65 72 20 65 78 65  ch are never exe
1fe10 72 63 69 73 65 64 2e 20 20 49 66 20 61 6e 79 20  rcised.  If any 
1fe20 73 74 61 74 65 20 69 73 20 6d 69 73 73 65 64 2c  state is missed,
1fe30 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a   make the.    **
1fe40 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c   return code SQL
1fe50 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 20 20 2a  ITE_ERROR..    *
1fe60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1fe70 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45  E_TESTCTRL_PARSE
1fe80 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 20 20  R_COVERAGE: {.  
1fe90 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
1fea0 76 61 5f 61 72 67 28 61 70 2c 20 46 49 4c 45 2a  va_arg(ap, FILE*
1feb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1fec0 69 74 65 33 50 61 72 73 65 72 43 6f 76 65 72 61  ite3ParserCovera
1fed0 67 65 28 6f 75 74 29 20 29 20 72 63 20 3d 20 53  ge(out) ) rc = S
1fee0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1fef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ff00 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1ff10 64 28 59 59 43 4f 56 45 52 41 47 45 29 20 2a 2f  d(YYCOVERAGE) */
1ff20 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1ff30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1ff40 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 20 2a  ITE_UNTESTABLE *
1ff50 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1ff60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1ff70 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1ff80 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1ff90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1ffa0 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1ffb0 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1ffc0 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1ffd0 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1ffe0 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1fff0 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
20000 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
20010 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
20020 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
20030 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
20040 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
20050 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
20060 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
20070 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
20080 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
20090 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
200a0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
200b0 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
200c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
200d0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
200e0 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
200f0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20100 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
20110 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
20120 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
20130 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
20140 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
20150 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
20160 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
20170 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
20180 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
20190 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
201a0 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
201b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
201c0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
201d0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
201e0 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
201f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
20200 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
20210 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
20220 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
20230 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
20240 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
20250 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
20260 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
20270 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
20280 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
20290 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
202a0 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
202b0 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
202c0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
202d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
202e0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
202f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20300 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
20310 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
20320 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
20330 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
20340 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
20350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
20360 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
20370 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
20380 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
20390 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
203a0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
203b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
203c0 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
203d0 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
203e0 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
203f0 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
20400 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
20410 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
20420 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
20430 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
20440 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
20450 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
20460 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
20470 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
20480 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
20490 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
204a0 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
204b0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
204c0 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
204d0 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
204e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
204f0 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
20500 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
20510 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
20520 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
20530 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
20540 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
20550 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
20560 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
20570 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
20580 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
20590 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20 29 7b 0a  64(z, &v)==0 ){.
205a0 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20      bDflt = v;. 
205b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c   }.  return bDfl
205c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
205d0 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69  rn the Btree poi
205e0 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  nter identified 
205f0 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74  by zDbName.  Ret
20600 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
20610 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20  found..*/.Btree 
20620 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f  *sqlite3DbNameTo
20630 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  Btree(sqlite3 *d
20640 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
20650 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  DbName){.  int i
20660 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f 20 73  Db = zDbName ? s
20670 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
20680 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20 3a 20  (db, zDbName) : 
20690 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3c  0;.  return iDb<
206a0 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44 62 5b  0 ? 0 : db->aDb[
206b0 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a  iDb].pBt;.}../*.
206c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
206d0 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
206e0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
206f0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
20700 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
20710 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
20720 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
20730 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
20740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
20750 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
20760 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
20770 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
20780 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
20790 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
207a0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
207b0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
207c0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
207d0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
207e0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
207f0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
20800 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
20810 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
20820 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
20830 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
20840 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
20850 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
20860 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
20870 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
20880 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
20890 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
208a0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
208b0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
208c0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
208d0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
208e0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
208f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20900 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
20910 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
20920 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
20930 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
20940 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
20950 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
20960 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d  }.#endif.  pBt =
20970 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
20980 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
20990 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  e);.  return pBt
209a0 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   ? sqlite3BtreeI
209b0 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a  sReadonly(pBt) :
209c0 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   -1;.}..#ifdef S
209d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
209e0 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  PSHOT./*.** Obta
209f0 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  in a snapshot ha
20a00 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61  ndle for the sna
20a10 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73  pshot of databas
20a20 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20  e zDb currently 
20a30 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62  .** being read b
20a40 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  y handle db..*/.
20a50 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  int sqlite3_snap
20a60 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69  shot_get(.  sqli
20a70 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
20a80 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73  t char *zDb,.  s
20a90 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
20aa0 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a  **ppSnapshot.){.
20ab0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20ac0 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66  E_ERROR;.#ifndef
20ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
20ae0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20af0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
20b00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
20b10 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
20b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
20b30 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
20b40 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
20b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
20b60 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
20b70 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
20b80 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
20b90 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
20ba0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
20bb0 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
20bc0 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
20bd0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
20be0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
20bf0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
20c00 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
20c10 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
20c20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
20c30 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
20c40 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
20c50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20c80 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65  3PagerSnapshotGe
20c90 74 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t(sqlite3BtreePa
20ca0 67 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70  ger(pBt), ppSnap
20cb0 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  shot);.        }
20cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20cd0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
20ce0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
20cf0 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
20d00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
20d10 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
20d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
20d30 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
20d40 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68  on on the snapsh
20d50 6f 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79  ot idendified by
20d60 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69   pSnapshot..*/.i
20d70 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
20d80 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69  hot_open(.  sqli
20d90 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
20da0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20  t char *zDb, .  
20db0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
20dc0 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20   *pSnapshot.){. 
20dd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20de0 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
20df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
20e00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20e10 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
20e20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
20e30 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
20e40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20e50 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
20e60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
20e70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
20e80 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
20e90 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
20ea0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit==0 ){.    in
20eb0 74 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d  t iDb;.    iDb =
20ec0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
20ed0 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  me(db, zDb);.   
20ee0 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
20ef0 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  Db>1 ){.      Bt
20f00 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
20f10 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
20f20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
20f30 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
20f40 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
20f50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20f60 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
20f70 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n(sqlite3BtreePa
20f80 67 65 72 28 70 42 74 29 2c 20 70 53 6e 61 70 73  ger(pBt), pSnaps
20f90 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  hot);.        if
20fa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20fc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
20fd0 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
20fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20ff0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
21000 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  Open(sqlite3Btre
21010 65 50 61 67 65 72 28 70 42 74 29 2c 20 30 29 3b  ePager(pBt), 0);
21020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21030 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21040 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21050 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
21060 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
21070 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
21080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21090 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20  *.** Recover as 
210a0 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61  many snapshots a
210b0 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
210c0 74 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73  the wal file ass
210d0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
210e0 73 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61  schema zDb of da
210f0 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e  tabase db..*/.in
21100 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
21110 6f 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74  ot_recover(sqlit
21120 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
21130 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20  ar *zDb){.  int 
21140 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
21150 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69  R;.  int iDb;.#i
21160 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21170 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
21180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
21190 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
211a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
211b0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
211c0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
211d0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
211e0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  if..  sqlite3_mu
211f0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
21200 74 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  tex);.  iDb = sq
21210 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
21220 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  db, zDb);.  if( 
21230 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
21240 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
21250 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
21260 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d  .pBt;.    if( 0=
21270 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
21280 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20  nReadTrans(pBt) 
21290 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
212a0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
212b0 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
212c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
212d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
212e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
212f0 65 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65  erSnapshotRecove
21300 72 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r(sqlite3BtreePa
21310 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20  ger(pBt));.     
21320 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
21330 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
21340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21350 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21360 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
21370 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
21380 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
21390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
213a0 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70  *.** Free a snap
213b0 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61  shot handle obta
213c0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
213d0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29  3_snapshot_get()
213e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
213f0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28  3_snapshot_free(
21400 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
21410 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20   *pSnapshot){.  
21420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e  sqlite3_free(pSn
21430 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69  apshot);.}.#endi
21440 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
21450 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a  LE_SNAPSHOT */..
21460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21470 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
21480 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69  N_DIAGS./*.** Gi
21490 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
214a0 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  a compile-time o
214b0 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72  ption, return tr
214c0 75 65 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f  ue if that optio
214d0 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e  n.** was used an
214e0 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
214f0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63  **.** The name c
21500 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  an optionally be
21510 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45  gin with "SQLITE
21520 5f 22 20 62 75 74 20 74 68 65 20 22 53 51 4c 49  _" but the "SQLI
21530 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69  TE_" prefix.** i
21540 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66  s not required f
21550 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69  or a match..*/.i
21560 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  nt sqlite3_compi
21570 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f  leoption_used(co
21580 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61  nst char *zOptNa
21590 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  me){.  int i, n;
215a0 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63  .  int nOpt;.  c
215b0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
215c0 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20  mpileOpt;. .#if 
215d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
215e0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f  I_ARMOR.  if( zO
215f0 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ptName==0 ){.   
21600 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
21610 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
21620 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
21630 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65  dif..  azCompile
21640 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  Opt = sqlite3Com
21650 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70  pileOptions(&nOp
21660 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  t);..  if( sqlit
21670 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e  e3StrNICmp(zOptN
21680 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20  ame, "SQLITE_", 
21690 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65  7)==0 ) zOptName
216a0 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c   += 7;.  n = sql
216b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
216c0 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69  tName);..  /* Si
216d0 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d  nce nOpt is norm
216e0 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64  ally in single d
216f0 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20  igits, a linear 
21700 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20  search is .  ** 
21710 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65  adequate. No nee
21720 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73  d for a binary s
21730 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28  earch. */.  for(
21740 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b  i=0; i<nOpt; i++
21750 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
21760 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e  e3StrNICmp(zOptN
21770 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  ame, azCompileOp
21780 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  t[i], n)==0.    
21790 20 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43   && sqlite3IsIdC
217a0 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  har((unsigned ch
217b0 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b  ar)azCompileOpt[
217c0 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b  i][n])==0.    ){
217d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
217e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
217f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
21800 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20  Return the N-th 
21810 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
21820 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20  ion string.  If 
21830 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
21840 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e  e,.** return a N
21850 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
21860 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
21870 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
21880 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20  n_get(int N){.  
21890 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73  int nOpt;.  cons
218a0 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69  t char **azCompi
218b0 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69  leOpt;.  azCompi
218c0 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43  leOpt = sqlite3C
218d0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e  ompileOptions(&n
218e0 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30  Opt);.  if( N>=0
218f0 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20   && N<nOpt ){.  
21900 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69    return azCompi
21910 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20  leOpt[N];.  }.  
21920 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
21930 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21940 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
21950 44 49 41 47 53 20 2a 2f 0a                       DIAGS */.