/ Hex Artifact Content
Login

Artifact 815aee401c9a031449f28d26fdf5d33104cbcd5c86709b11614362cd12e5445c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 28 73 71 6c 69 74 65 33 5f 69  c( sz*(sqlite3_i
63e0: 6e 74 36 34 29 63 6e 74 20 29 3b 20 20 2f 2a 20  nt64)cnt );  /* 
63f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6400: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6410: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6420: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6430: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6440: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6450: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6460: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6470: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6480: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6490: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
64a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
64b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
64c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
64d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
64f0: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
6500: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
6510: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
6520: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
6530: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
6540: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
6550: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6560: 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20 20  .nSlot = cnt;.  
6570: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
6580: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
6590: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
65a0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
65b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
65c0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 3b  lookaside.pInit;
65d0: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
65e0: 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b 0a  side.pInit = p;.
65f0: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
6600: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
6610: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
6620: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6630: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
6640: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
6650: 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  sable = 0;.    d
6660: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6670: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
6680: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
6690: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66a0: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
66b0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
66c0: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
66d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
66e0: 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  isable = 1;.    
66f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6700: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 20  alloced = 0;.   
6710: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
6720: 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Slot = 0;.  }.#e
6730: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6740: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f  MIT_LOOKASIDE */
6750: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6760: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6770: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
6780: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6790: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
67a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
67b0: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
67c0: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
67d0: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
67e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
67f0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6800: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6810: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6820: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6830: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6840: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
6850: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
6860: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
6870: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
6880: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
6890: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
68a0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
68b0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
68c0: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
68d0: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
68e0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
68f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6900: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6910: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6920: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6940: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
6950: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6960: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6980: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
69a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
69b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
69c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
69d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
69e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
69f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6a00: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6a10: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6a20: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6a30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6a40: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
6a50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6a60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6a80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6a90: 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  Flush any dirty 
6aa0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
6ab0: 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79  er-cache for any
6ac0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6ad0: 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  se.** to disk..*
6ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6af0: 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69  _cacheflush(sqli
6b00: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6b10: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
6b20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62  LITE_OK;.  int b
6b30: 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23  SeenBusy = 0;..#
6b40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b50: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6b60: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6b70: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6b90: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6ba0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6bb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6bc0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6bd0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6be0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6bf0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6c00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6c10: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6c20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6c30: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6c40: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6c50: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6c60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6c70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6c80: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
6c90: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6ca0: 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20  Flush(pPager);. 
6cb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6cc0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
6cd0: 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20      bSeenBusy = 
6ce0: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
6cf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6d10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6d20: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6d30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6d40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6d50: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
6d60: 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79  _OK && bSeenBusy
6d70: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
6d80: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
6d90: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6da0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6db0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6dc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6dd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6de0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6df0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6e00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6e10: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6e20: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6e30: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6e40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6e50: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
6e60: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50  : {.      /* IMP
6e70: 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31 20  : R-06824-28531 
6e80: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  */.      /* IMP:
6e90: 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20 2a   R-36257-52125 *
6ea0: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  /.      db->aDb[
6eb0: 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76 61  0].zDbSName = va
6ec0: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  E_OK;.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6f00: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6f10: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
6f20: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
6f30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
6f40: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
6f50: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
6f60: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
6f70: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6f80: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
6f90: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
6fa0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
6fb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6fc0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
6fd0: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
6fe0: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
6ff0: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
7000: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
7010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7020: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7030: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
7040: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
7050: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
7060: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
7070: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
7080: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
7090: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
70a0: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
70b0: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
70c0: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
70d0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
70e0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
70f0: 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EY,           SQ
7100: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
7110: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7120: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7130: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
7140: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
7150: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
7160: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7170: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7180: 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52  E_FTS3_TOKENIZER
7190: 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b  , SQLITE_Fts3Tok
71a0: 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20 20  enizer  },.     
71b0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
71c0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  NFIG_ENABLE_LOAD
71d0: 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c 49  _EXTENSION, SQLI
71e0: 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
71f0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
7200: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
7210: 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 2c  O_CKPT_ON_CLOSE,
7220: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f 43        SQLITE_NoC
7230: 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a 20  kptOnClose  },. 
7240: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7250: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
7260: 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20 20  QPSG,           
7270: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
7280: 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  G     },.       
7290: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
72a0: 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
72b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
72c0: 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20 20  _TriggerEQP     
72d0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
72e0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53  ITE_DBCONFIG_RES
72f0: 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20 20  ET_DATABASE,    
7300: 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65 74      SQLITE_Reset
7310: 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20 20  Database  },.   
7320: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7330: 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
7340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
7350: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 20  LITE_Defensive  
7360: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7370: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7380: 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
7390: 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57  ,       SQLITE_W
73a0: 72 69 74 65 53 63 68 65 6d 61 7c 0a 20 20 20 20  riteSchema|.    
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
73e0: 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f  ITE_NoSchemaErro
73f0: 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  r  },.      };. 
7400: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
7410: 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t i;.      rc = 
7420: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
7430: 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33   IMP: R-42790-23
7440: 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  372 */.      for
7450: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
7460: 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29  e(aFlagOp); i++)
7470: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  {.        if( aF
7480: 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20  lagOp[i].op==op 
7490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
74a0: 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28   onoff = va_arg(
74b0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
74c0: 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20      int *pRes = 
74d0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
74e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20  ;.          u64 
74f0: 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  oldFlags = db->f
7500: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
7510: 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20  if( onoff>0 ){. 
7520: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66             db->f
7530: 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b  lags |= aFlagOp[
7540: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
7550: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f     }else if( ono
7560: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
7570: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
7580: 3d 20 7e 28 75 36 34 29 61 46 6c 61 67 4f 70 5b  = ~(u64)aFlagOp[
7590: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
75a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
75b0: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
75c0: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
75e0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
75f0: 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  ments(db, 0);.  
7600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7610: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
7620: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
7630: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7640: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
7650: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
7660: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
7670: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
76a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76b0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
76c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
76d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
76e0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
76f0: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
7700: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
7710: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
7720: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
7730: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
7740: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
7750: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
7760: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
7770: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
7780: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
7790: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
77a0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
77b0: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
77c0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
77d0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
77e0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
77f0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
7800: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
7810: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
7820: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
7830: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
7840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
7850: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
7860: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
7870: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
7880: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
7890: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
78a0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
78b0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
78c0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
78d0: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
78e0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
78f0: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
7900: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
7910: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
7920: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
7930: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
7940: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
7950: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
7960: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
7970: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
7980: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
7990: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 61   library. */.  a
79a0: 73 73 65 72 74 28 20 70 4b 65 79 31 20 26 26 20  ssert( pKey1 && 
79b0: 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20 3d 20  pKey2 );.  rc = 
79c0: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
79d0: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
79e0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
79f0: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
7a00: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
7a10: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
7a20: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
7a30: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
7a40: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
7a50: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
7a60: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7a70: 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52  -31624-24737 RTR
7a80: 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52  IM is like BINAR
7a90: 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78  Y except that ex
7aa0: 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61  tra.      ** spa
7ab0: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ces at the end o
7ac0: 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20  f either string 
7ad0: 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
7ae0: 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68  e result. In oth
7af0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64  er.      ** word
7b00: 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20  s, strings will 
7b10: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
7b20: 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20   one another as 
7b30: 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20  long as they.   
7b40: 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c     ** differ onl
7b50: 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  y in the number 
7b60: 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65  of spaces at the
7b70: 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   end..      */. 
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
7ba0: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
7bb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7bc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7bd0: 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20 74 68  if CollSeq is th
7be0: 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c 74 2d  e default built-
7bf0: 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e  in BINARY..*/.in
7c00: 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  t sqlite3IsBinar
7c10: 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  y(const CollSeq 
7c20: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
7c30: 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d  ==0 || p->xCmp!=
7c40: 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c 7c 20 70  binCollFunc || p
7c50: 2d 3e 70 55 73 65 72 21 3d 30 0a 20 20 20 20 20  ->pUser!=0.     
7c60: 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
7c70: 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e 41 52  (p->zName,"BINAR
7c80: 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  Y")==0 );.  retu
7c90: 72 6e 20 70 3d 3d 30 20 7c 7c 20 28 70 2d 3e 78  rn p==0 || (p->x
7ca0: 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63  Cmp==binCollFunc
7cb0: 20 26 26 20 70 2d 3e 70 55 73 65 72 3d 3d 30 29   && p->pUser==0)
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7cd0: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7ce0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7cf0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7d00: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7d10: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7d20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7d30: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7d40: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7d50: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7d60: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7d70: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7d80: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7d90: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7da0: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7db0: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7dc0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7dd0: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7de0: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7df0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7e00: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7e10: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7e20: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7e30: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7e40: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7e50: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7e60: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7e70: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7e80: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7e90: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7eb0: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7ec0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7ed0: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7ee0: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7ef0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7f00: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7f10: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7f20: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7f30: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7f40: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7f50: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7f60: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7f70: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7f80: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7f90: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7fa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7fb0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7fc0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7fd0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7fe0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7ff0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8000: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8010: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
8020: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
8030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8040: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
8050: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
8060: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
8070: 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  id() API functio
8080: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8090: 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65  e3_set_last_inse
80a0: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
80b0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *db, sqlite3_in
80c0: 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66  t64 iRowid){.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
80e0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
80f0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8100: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
8110: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
8120: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
8130: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
8140: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
8150: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8160: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74  tex);.  db->last
8170: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
8180: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8190: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
81a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
81b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
81c0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
81d0: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
81e0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
81f0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
8200: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
8210: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
8220: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
8230: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
8240: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8250: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
8260: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
8270: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8280: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8290: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
82a0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
82b0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
82c0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
82d0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
82e0: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
82f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8300: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
8310: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
8320: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8330: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
8340: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
8350: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
8360: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
8370: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8380: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8390: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
83a0: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
83b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
83c0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
83d0: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
83e0: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
83f0: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
8400: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
8410: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
8420: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
8430: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
8440: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
8450: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
8460: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
8470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
8480: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
8490: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
84a0: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
84b0: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
84c0: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
84d0: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
84e0: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
84f0: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
8500: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8510: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
8520: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
8530: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
8540: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
8550: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
8560: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
8570: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8580: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
8590: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
85a0: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
85b0: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
85c0: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
85d0: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
85e0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
85f0: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
8600: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
8610: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
8620: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
8630: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
8640: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
8650: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
8660: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
8670: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
8680: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
8690: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
86a0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
86b0: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
86c0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
86d0: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
86e0: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
86f0: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8700: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8710: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
8720: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
8730: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
8740: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
8750: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
8760: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
8770: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8780: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8790: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
87a0: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
87b0: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
87c0: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
87d0: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
87e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
87f0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
8800: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
8810: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
8820: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
8830: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
8840: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
8850: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8860: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
8870: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8880: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
8890: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
88a0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
88b0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
88c0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
88d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
88e0: 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  a;.    if( pSche
88f0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ma ){.      for(
8900: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
8910: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
8920: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
8930: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
8940: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
8950: 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71  ab = (Table *)sq
8960: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
8970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
8980: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73  irtual(pTab) ) s
8990: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
89a0: 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a  nect(db, pTab);.
89b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
89c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
89d0: 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41  LE_SHARED_SCHEMA
89e0: 0a 20 20 20 20 69 66 28 20 49 73 53 68 61 72 65  .    if( IsShare
89f0: 64 53 63 68 65 6d 61 28 64 62 29 20 26 26 20 69  dSchema(db) && i
8a00: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 56 54 61  !=1 ){.      VTa
8a10: 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b 0a 20 20  ble *pVTable;.  
8a20: 20 20 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78      VTable *pNex
8a30: 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 56 54  t;.      for(pVT
8a40: 61 62 6c 65 3d 64 62 2d 3e 61 44 62 5b 69 5d 2e  able=db->aDb[i].
8a50: 70 56 54 61 62 6c 65 3b 20 70 56 54 61 62 6c 65  pVTable; pVTable
8a60: 3b 20 70 56 54 61 62 6c 65 3d 70 4e 65 78 74 29  ; pVTable=pNext)
8a70: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  {.        pNext 
8a80: 3d 20 70 56 54 61 62 6c 65 2d 3e 70 4e 65 78 74  = pVTable->pNext
8a90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8aa0: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61  3VtabUnlock(pVTa
8ab0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
8ac0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70      db->aDb[i].p
8ad0: 56 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  VTable = 0;.    
8ae0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
8af0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b00: 53 48 41 52 45 44 5f 53 43 48 45 4d 41 20 2a 2f  SHARED_SCHEMA */
8b10: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c  .  }.  for(p=sql
8b20: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
8b30: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70  ->aModule); p; p
8b40: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8b50: 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  p)){.    Module 
8b60: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
8b70: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
8b80: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (p);.    if( pMo
8b90: 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20  d->pEpoTab ){.  
8ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 44      sqlite3VtabD
8bb0: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d  isconnect(db, pM
8bc0: 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20  od->pEpoTab);.  
8bd0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8be0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
8bf0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
8c00: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
8c10: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
8c20: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23  PARAMETER(db);.#
8c30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
8c40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61  eturn TRUE if da
8c50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8c60: 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c  n db has unfinal
8c70: 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a  ized prepared.**
8c80: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75   statements or u
8c90: 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65  nfinished sqlite
8ca0: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
8cb0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
8cc0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  t connectionIsBu
8cd0: 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sy(sqlite3 *db){
8ce0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
8cf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8d00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
8d10: 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70  ) );.  if( db->p
8d20: 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Vdbe ) return 1;
8d30: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
8d40: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
8d50: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8d60: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
8d70: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
8d80: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
8d90: 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72  kup(pBt) ) retur
8da0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
8db0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n 0;.}../*.** Cl
8dc0: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
8dd0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
8de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
8df0: 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74  lite3Close(sqlit
8e00: 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63  e3 *db, int forc
8e10: 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20  eZombie){.  if( 
8e20: 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  !db ){.    /* EV
8e30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32  IDENCE-OF: R-632
8e40: 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67  57-11740 Calling
8e50: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
8e60: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
8e70: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69  e3_close_v2() wi
8e80: 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  th a NULL pointe
8e90: 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  r argument is a 
8ea0: 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
8eb0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
8ec0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
8ed0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
8ee0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
8ef0: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
8f00: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
8f10: 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
8f20: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8f30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
8f40: 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51   db->mTrace & SQ
8f50: 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
8f60: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61   ){.    db->xTra
8f70: 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  ce(SQLITE_TRACE_
8f80: 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63  CLOSE, db->pTrac
8f90: 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20  eArg, db, 0);.  
8fa0: 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44  }..  /* Force xD
8fb0: 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20  isconnect calls 
8fc0: 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74  on all virtual t
8fd0: 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f  ables */.  disco
8fe0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29  nnectAllVtab(db)
8ff0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
9000: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
9010: 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74  , the disconnect
9020: 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61  AllVtab() call a
9030: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
9040: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
9050: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
9060: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
9070: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
9080: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
9090: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
90a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
90b0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
90c0: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
90d0: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
90e0: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
90f0: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
9100: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
9110: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
9120: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
9130: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
9140: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
9150: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
9160: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
9170: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
9180: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
9190: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
91a0: 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20  Legacy behavior 
91b0: 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29  (sqlite3_close()
91c0: 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f   behavior) is to
91d0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
91e0: 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20  ITE_BUSY if the 
91f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e  connection can n
9200: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
9210: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
9220: 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69   if( !forceZombi
9230: 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  e && connectionI
9240: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
9250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
9260: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
9270: 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f  BUSY, "unable to
9280: 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e   close due to un
9290: 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20  finalized ".    
92a0: 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f     "statements o
92b0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63  r unfinished bac
92c0: 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  kups");.    sqli
92d0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
92e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
92f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
9300: 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  SY;.  }..#ifdef 
9310: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
9320: 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
9330: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
9340: 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
9350: 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e   Closing the han
9360: 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61  dle. Fourth para
9370: 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
9380: 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a  the value 2. */.
9390: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
93a0: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
93b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
93c0: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
93d0: 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23  db, 0, 2);.  }.#
93e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76  endif..  /* Conv
93f0: 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ert the connecti
9400: 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65  on into a zombie
9410: 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20   and then close 
9420: 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d  it..  */.  db->m
9430: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
9440: 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71  GIC_ZOMBIE;.  sq
9450: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
9460: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62  ndCloseZombie(db
9470: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9480: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9490: 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f  Two variations o
94a0: 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74  n the public int
94b0: 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69  erface for closi
94c0: 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
94d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
94e0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
94f0: 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73   version returns
9500: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
9510: 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63  .** leaves the c
9520: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e  onnection option
9530: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e   if there are un
9540: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
9550: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
9560: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
9570: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20  qlite3_backups. 
9580: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
9590: 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69  se_v2().** versi
95a0: 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f  on forces the co
95b0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f  nnection to beco
95c0: 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74  me a zombie if t
95d0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c  here are.** uncl
95e0: 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20  osed resources, 
95f0: 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72  and arranges for
9600: 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68   deallocation wh
9610: 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70  en the last.** p
9620: 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
9630: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
9640: 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e  up closes..*/.in
9650: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
9660: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
9670: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
9680: 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73  e(db,0); }.int s
9690: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
96a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
96b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73  turn sqlite3Clos
96c0: 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a  e(db,1); }.../*.
96d0: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74  ** Close the mut
96e0: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63  ex on database c
96f0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a  onnection db..**
9700: 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  .** Furthermore,
9710: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
9720: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20  nection db is a 
9730: 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20  zombie (meaning 
9740: 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61  that there.** ha
9750: 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63  s been a prior c
9760: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
9770: 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69  lose(db) or sqli
9780: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
9790: 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73  ) and.** every s
97a0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20  qlite3_stmt has 
97b0: 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  now been finaliz
97c0: 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c  ed and every sql
97d0: 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a  ite3_backup has.
97e0: 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65  ** finished, the
97f0: 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  n free all resou
9800: 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rces..*/.void sq
9810: 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41  lite3LeaveMutexA
9820: 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71  ndCloseZombie(sq
9830: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61  lite3 *db){.  Ha
9840: 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20  shElem *i;      
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9860: 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72   Hash table iter
9870: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ator */.  int j;
9880: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
9890: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
98a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20  sqlite3_stmt or 
98b0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
98c0: 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69  bjects.  ** or i
98d0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
98e0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
98f0: 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69  n closed by sqli
9900: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a  te3_close_v2(),.
9910: 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c    ** then just l
9920: 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61  eave the mutex a
9930: 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
9940: 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21    if( db->magic!
9950: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f  =SQLITE_MAGIC_ZO
9960: 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69  MBIE || connecti
9970: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
9990: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
99a0: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  x);.    return;.
99b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
99c0: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
99d0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
99e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
99f0: 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a  nection has.  **
9a00: 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69   closed all sqli
9a10: 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c  te3_stmt and sql
9a20: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
9a30: 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e  cts and has been
9a40: 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  .  ** passed to 
9a50: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d  sqlite3_close (m
9a60: 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69  eaning that it i
9a70: 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68  s a zombie).  Th
9a80: 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f  erefore,.  ** go
9a90: 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20   ahead and free 
9aa0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  all resources.. 
9ab0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74   */..  /* If a t
9ac0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
9ad0: 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  en, roll it back
9ae0: 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75  . This also ensu
9af0: 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a  res that if.  **
9b00: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63   any database sc
9b10: 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20  hemas have been 
9b20: 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75  modified by an u
9b30: 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73  ncommitted trans
9b40: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79  action.  ** they
9b50: 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20   are reset. And 
9b60: 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65  that the require
9b70: 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
9b80: 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20  s held to make. 
9b90: 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f   ** the pager ro
9ba0: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
9bb0: 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69  a reset an atomi
9bc0: 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  c operation. */.
9bd0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
9be0: 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
9bf0: 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  OK);..  /* Free 
9c00: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
9c10: 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
9c20: 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ures. */.  sqlit
9c30: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
9c40: 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  s(db);..  /* Clo
9c50: 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  se all database 
9c60: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
9c70: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
9c80: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
9c90: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
9ca0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
9cb0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
9cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9cd0: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
9ce0: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
9cf0: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
9d00: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
9d10: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 44    sqlite3SchemaD
9d20: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 6a 2c  isconnect(db, j,
9d30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62   0);.        pDb
9d40: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  ->pSchema = 0;. 
9d50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9d60: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
9d70: 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61  TEMP schema sepa
9d80: 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20  rately and last 
9d90: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  */.  if( db->aDb
9da0: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
9db0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
9dc0: 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d  Clear(db->aDb[1]
9dd0: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  .pSchema);.  }. 
9de0: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
9df0: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f  ckList(db);..  /
9e00: 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72  * Free up the ar
9e10: 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ray of auxiliary
9e20: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
9e30: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
9e40: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
9e50: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9e60: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
9e70: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
9e80: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20  >aDbStatic );.. 
9e90: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64   /* Tell the cod
9ea0: 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68  e in notify.c th
9eb0: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
9ec0: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64  n no longer hold
9ed0: 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73  s any.  ** locks
9ee0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65   and does not re
9ef0: 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65  quire any furthe
9f00: 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  r unlock-notify 
9f10: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
9f20: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
9f30: 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a  ionClosed(db);..
9f40: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9f50: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75  shFirst(&db->aFu
9f60: 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  nc); i; i=sqlite
9f70: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9f80: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
9f90: 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  , *p;.    p = sq
9fa0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9fb0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
9fc0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
9fd0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65  b, p);.      pNe
9fe0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
9ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a000: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
a010: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
a020: 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d  }while( p );.  }
a030: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
a040: 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  ear(&db->aFunc);
a050: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
a060: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43  ashFirst(&db->aC
a070: 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71  ollSeq); i; i=sq
a080: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
a090: 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
a0a0: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20  Coll = (CollSeq 
a0b0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
a0c0: 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f  (i);.    /* Invo
a0d0: 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f  ke any destructo
a0e0: 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  rs registered fo
a0f0: 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  r collation sequ
a100: 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20  ence user data. 
a110: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
a120: 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
a130: 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44   if( pColl[j].xD
a140: 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  el ){.        pC
a150: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c  oll[j].xDel(pCol
a160: 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20  l[j].pUser);.   
a170: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
a180: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a190: 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73   pColl);.  }.  s
a1a0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
a1b0: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
a1c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a1d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a1e0: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
a1f0: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d  ashFirst(&db->aM
a200: 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c  odule); i; i=sql
a210: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
a220: 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  .    Module *pMo
a230: 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71  d = (Module *)sq
a240: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
a250: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78  .    if( pMod->x
a260: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20  Destroy ){.     
a270: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28   pMod->xDestroy(
a280: 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pMod->pAux);.   
a290: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74   }.    sqlite3Vt
a2a0: 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65  abEponymousTable
a2b0: 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b  Clear(db, pMod);
a2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a2d0: 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20  ee(db, pMod);.  
a2e0: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
a2f0: 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  lear(&db->aModul
a300: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  e);.#endif..  sq
a310: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
a320: 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65  QLITE_OK); /* De
a330: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
a340: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
a350: 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  gs. */.  sqlite3
a360: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
a370: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c  rr);.  sqlite3Cl
a380: 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oseExtensions(db
a390: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
a3a0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
a3b0: 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  N.  sqlite3_free
a3c0: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55  (db->auth.zAuthU
a3d0: 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ser);.  sqlite3_
a3e0: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
a3f0: 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a  uthPW);.#endif..
a400: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
a410: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
a420: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
a430: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
a440: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
a450: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
a460: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
a470: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
a480: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
a490: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
a4a0: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
a4b0: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
a4c0: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
a4d0: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
a4e0: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
a4f0: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
a500: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
a510: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
a520: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
a530: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
a540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
a550: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
a560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
a570: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  ree(db, db->aDb[
a580: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
a590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a5a0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a5b0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
a5c0: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
a5d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a5e0: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
a5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a600: 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65  ite3LookasideUse
a610: 64 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  d(db,0)==0 );.  
a620: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
a630: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
a640: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a650: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
a660: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tart);.  }.  sql
a670: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
a680: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
a690: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
a6a0: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
a6b0: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
a6c0: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
a6d0: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
a6e0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
a6f0: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
a700: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
a710: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
a720: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
a730: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
a740: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
a750: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
a760: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
a770: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
a780: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
a790: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
a7a0: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
a7b0: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
a7c0: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
a7d0: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
a7e0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a7f0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
a800: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
a810: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
a820: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
a830: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
a840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a850: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
a860: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
a870: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a880: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
a890: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
a8a0: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
a8b0: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
a8c0: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
a8d0: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
a8e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
a8f0: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
a900: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
a910: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
a920: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
a930: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
a940: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
a950: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
a960: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
a970: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
a980: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
a990: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
a9a0: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
a9b0: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
a9c0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
a9d0: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
a9e0: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
a9f0: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
aa00: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
aa10: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
aa20: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
aa30: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
aa40: 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73   = (db->mDbFlags
aa50: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
aa60: 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62  Change)!=0 && db
aa70: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a  ->init.busy==0;.
aa80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
aa90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
aaa0: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
aab0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
aac0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
aad0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
aae0: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
aaf0: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
ab00: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ab10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
ab20: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
ab30: 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67  de, !schemaChang
ab40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ab50: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
ab60: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
ab70: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
ab80: 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65  c();..  if( sche
ab90: 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  maChange ){.    
aba0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
abb0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
abc0: 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  db, 0);.    sqli
abd0: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
abe0: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
abf0: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
ac00: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
ac10: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
ac20: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
ac30: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
ac40: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
ac50: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
ac60: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
ac70: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
ac80: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
ac90: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36  b->flags &= ~(u6
aca0: 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  4)SQLITE_DeferFK
acb0: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
acc0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
acd0: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
ace0: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
acf0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
ad00: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
ad10: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
ad20: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
ad30: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
ad40: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
ad50: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
ad60: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
ad70: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
ad80: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
ad90: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
ada0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
adb0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
adc0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
add0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
ade0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
adf0: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
ae00: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
ae10: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
ae20: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
ae30: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
ae40: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
ae50: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
ae60: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
ae70: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
ae80: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
ae90: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
aea0: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
aeb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
aec0: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
aee0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aef0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
af00: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
af10: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
af20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
af30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e   SQLITE_ERROR_SN
af50: 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d  APSHOT:     zNam
af60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
af70: 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  R_SNAPSHOT";    
af80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af90: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
afa0: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
afb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
afc0: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
afd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afe0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b000: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
b010: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
b020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b030: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
b040: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
b050: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
b060: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
b070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b080: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
b090: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
b0a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b0b0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
b0c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
b0e0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
b0f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b100: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
b110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
b130: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
b140: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b150: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
b160: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
b180: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
b190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b1a0: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
b1b0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b1c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1d0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
b1e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1f0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
b200: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b210: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b220: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
b230: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
b240: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
b250: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
b260: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b270: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
b280: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b290: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
b2a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2c0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
b2d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b2e0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
b2f0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b310: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
b320: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
b330: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b340: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
b350: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b360: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
b370: 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d  NTINIT:  zName =
b380: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b390: 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65  Y_CANTINIT"; bre
b3a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3b0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b3c0: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
b3d0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b3e0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
b3f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b400: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b410: 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65  DBMOVED:   zName
b420: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b430: 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62  NLY_DBMOVED";  b
b440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b450: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b460: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d  _DIRECTORY: zNam
b470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b480: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b  ONLY_DIRECTORY";
b490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4a0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
b4b0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
b4c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
b4d0: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
b4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b520: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
b530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b540: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b550: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
b560: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b570: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b590: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b5a0: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
b5b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b5c0: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
b5d0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
b5e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b5f0: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
b600: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b610: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
b620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b640: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
b650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b660: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
b670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b690: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
b6a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b6b0: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
b6c0: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
b6d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6e0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
b6f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b700: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
b710: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
b720: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b730: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
b740: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b750: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
b760: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b770: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b780: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
b790: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b7a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b7b0: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
b7c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7d0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
b7e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b7f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b800: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
b810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b820: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b830: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b840: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b850: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
b860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b870: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b880: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b890: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
b8a0: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
b8b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b8c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b8d0: 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SS:       zName 
b8e0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b8f0: 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72  ACCESS";      br
b900: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b910: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b920: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a  CKRESERVEDLOCK:.
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b960: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b970: 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  VEDLOCK"; break;
b980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b990: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
b9a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b9b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b9c0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b9d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9e0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a  ITE_IOERR_CLOSE:
b9f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ba00: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  "SQLITE_IOERR_CL
ba10: 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  OSE";       brea
ba20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ba30: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
ba40: 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  LOSE:    zName =
ba50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
ba60: 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65  IR_CLOSE";   bre
ba70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
ba90: 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PEN:      zName 
baa0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
bab0: 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72  SHMOPEN";     br
bac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
bae0: 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SIZE:      zName
baf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
bb00: 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62  _SHMSIZE";     b
bb10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bb20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
bb30: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d  MLOCK:      zNam
bb40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
bb50: 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20  R_SHMLOCK";     
bb60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb70: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
bb80: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61  HMMAP:       zNa
bb90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
bba0: 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20  RR_SHMMAP";     
bbb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bbc0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
bbd0: 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  SEEK:         zN
bbe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
bbf0: 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20  ERR_SEEK";      
bc00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
bc20: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a  _DELETE_NOENT: z
bc30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
bc40: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
bc50: 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T";break;.      
bc60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
bc70: 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20  R_MMAP:         
bc80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bc90: 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20  IOERR_MMAP";    
bca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bcb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
bcc0: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20  RR_GETTEMPPATH: 
bcd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bce0: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
bcf0: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
bd00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
bd10: 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20  ERR_CONVPATH:   
bd20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bd30: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
bd40: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
bd50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bd60: 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ORRUPT:         
bd70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bd80: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
bd90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bda0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bdb0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20  CORRUPT_VTAB:   
bdc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bdd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
bde0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
bdf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
be00: 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20  _NOTFOUND:      
be10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
be20: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20  LITE_NOTFOUND"; 
be30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
be40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be50: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20  E_FULL:         
be60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
be70: 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20  QLITE_FULL";    
be80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
be90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bea0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20  TE_CANTOPEN:    
beb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bec0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22  SQLITE_CANTOPEN"
bed0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
bee0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bef0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
bf00: 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20  EMPDIR: zName = 
bf10: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
bf20: 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61  _NOTEMPDIR";brea
bf30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
bf50: 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  DIR:     zName =
bf60: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bf70: 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65  N_ISDIR";    bre
bf80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf90: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
bfa0: 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ULLPATH:  zName 
bfb0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bfc0: 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72  EN_FULLPATH"; br
bfd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bfe0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bff0: 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65  CONVPATH:  zName
c000: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
c010: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62  PEN_CONVPATH"; b
c020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c030: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
c040: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
c050: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54  e = "SQLITE_PROT
c060: 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20  OCOL";          
c070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c080: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c0a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50  me = "SQLITE_EMP
c0b0: 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TY";            
c0c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c0d0: 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  se SQLITE_SCHEMA
c0e0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c0f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
c100: 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20  HEMA";          
c110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c120: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
c130: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  G:             z
c140: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
c150: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20  OOBIG";         
c160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c170: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c180: 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20  TRAINT:         
c190: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c1a0: 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20  CONSTRAINT";    
c1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c1c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c1d0: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20  STRAINT_UNIQUE: 
c1e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c1f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
c200: 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  UE"; break;.    
c210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c220: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
c230: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
c240: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
c250: 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  GGER";break;.   
c260: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c270: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
c280: 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  NKEY:.          
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c2b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c2c0: 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20  _FOREIGNKEY";   
c2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c2e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c2f0: 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61  INT_CHECK:   zNa
c300: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c310: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20  STRAINT_CHECK"; 
c320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c330: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c340: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a  AINT_PRIMARYKEY:
c350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c380: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
c390: 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  ARYKEY";   break
c3a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c3b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
c3c0: 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20  OTNULL: zName = 
c3d0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c3e0: 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61  NT_NOTNULL";brea
c3f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c400: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c410: 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20  COMMITHOOK:.    
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c440: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c450: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
c460: 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  K";   break;.   
c470: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c480: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20  ONSTRAINT_VTAB: 
c490: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c4a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
c4b0: 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  AB";   break;.  
c4c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c4d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
c4e0: 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ION:.           
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c510: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c520: 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62  FUNCTION";     b
c530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c540: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c550: 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d  NT_ROWID:   zNam
c560: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c570: 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20  TRAINT_ROWID";  
c580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c590: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
c5a0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  H:           zNa
c5b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
c5c0: 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20 20  MATCH";         
c5d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c5e0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
c5f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c600: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
c610: 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20  SUSE";          
c620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c630: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
c640: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
c650: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c660: 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20  OLFS";          
c670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c680: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
c690: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
c6a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c6b0: 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20  AUTH";          
c6c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c6d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
c6e0: 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  MAT:            
c6f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c700: 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20  _FORMAT";       
c710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
c730: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
c740: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c750: 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20  E_RANGE";       
c760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c770: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c780: 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20  OTADB:          
c790: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c7a0: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
c7b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c7c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c7d0: 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROW:            
c7e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c7f0: 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
c800: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c810: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c820: 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20  _NOTICE:        
c830: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c840: 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20  LITE_NOTICE";   
c850: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c860: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c870: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
c880: 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  _WAL: zName = "S
c890: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c8a0: 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b  OVER_WAL";break;
c8b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c8c0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
c8d0: 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20  R_ROLLBACK:.    
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c900: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
c910: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
c920: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
c930: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
c940: 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20  ARNING:         
c950: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c960: 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20  TE_WARNING";    
c970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c980: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c990: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
c9a0: 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  X:  zName = "SQL
c9b0: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
c9c0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
c9d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c9e0: 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20  _DONE:          
c9f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ca00: 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
ca10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ca20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ca30: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
ca40: 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75 66  static char zBuf
ca50: 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [50];.    sqlite
ca60: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
ca70: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
ca80: 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25  SQLITE_UNKNOWN(%
ca90: 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20  d)", origRc);.  
caa0: 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a    zName = zBuf;.
cab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
cac0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
cad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
cae0: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
caf0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
cb00: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
cb10: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
cb20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
cb30: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
cb40: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
cb50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
cb60: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
cb70: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
cb80: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
cb90: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
cba0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cbb0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
cbc0: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
cbd0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cbe0: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
cbf0: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
cc00: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
cc10: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
cc20: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
cc30: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
cc40: 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72 79 20        */ "query 
cc50: 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a  aborted",.    /*
cc60: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
cc70: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
cc80: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
cc90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
cca0: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
ccb0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
ccc0: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
ccd0: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
cce0: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
ccf0: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
cd00: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
cd10: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
cd20: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
cd30: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
cd40: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
cd50: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
cd60: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cd70: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
cd80: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
cd90: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
cda0: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
cdb0: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
cdc0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
cdd0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cde0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
cdf0: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
ce00: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
ce10: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
ce20: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
ce30: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
ce40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
ce50: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
ce60: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
ce70: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
ce80: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
ce90: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
cea0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
ceb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
cec0: 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  Y       */ 0,.  
ced0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
cee0: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
cef0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
cf00: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
cf10: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
cf20: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
cf30: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
cf40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
cf50: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
cf60: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
cf70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cf80: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
cf90: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
cfa0: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
cfb0: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
cfc0: 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72  / "bad parameter
cfd0: 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20 6d 69   or other API mi
cfe0: 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20 53 51  suse",.#ifdef SQ
cff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
d000: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
d010: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
d020: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
d030: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
d040: 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c  #else.    /* SQL
d050: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
d060: 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20  */ 0,.#endif.   
d070: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20   /* SQLITE_AUTH 
d080: 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f         */ "autho
d090: 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22  rization denied"
d0a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
d0b0: 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 30  FORMAT      */ 0
d0c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
d0d0: 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22  RANGE       */ "
d0e0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
d0f0: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
d100: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
d110: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
d120: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
d130: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
d140: 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a 2f 20  _NOTICE      */ 
d150: 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d 65  "notification me
d160: 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  ssage",.    /* S
d170: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 20 20  QLITE_WARNING   
d180: 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d 65    */ "warning me
d190: 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  ssage",.  };.  c
d1a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
d1b0: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
d1c0: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
d1d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
d1e0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
d1f0: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
d200: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
d210: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
d220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d230: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
d240: 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  W: {.      zErr 
d250: 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77 20 61  = "another row a
d260: 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20  vailable";.     
d270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d280: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
d290: 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  NE: {.      zErr
d2a0: 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77 73   = "no more rows
d2b0: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
d2c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d2d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
d2e0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
d2f0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
d300: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
d310: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
d320: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
d330: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
d340: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
d350: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d360: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d370: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
d380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
d390: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
d3a0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
d3b0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
d3c0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
d3d0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
d3e0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
d3f0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
d400: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
d410: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
d420: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
d430: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
d440: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52  rgument..**.** R
d450: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  eturn non-zero t
d460: 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f 63 6b  o retry the lock
d470: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 74  .  Return zero t
d480: 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a 2a  o stop trying.**
d490: 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c 69 74   and cause SQLit
d4a0: 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  e to return SQLI
d4b0: 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61 74  TE_BUSY..*/.stat
d4c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
d4d0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
d4e0: 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  (.  void *ptr,  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d500: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d510: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  ion */.  int cou
d520: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
d530: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d540: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
d550: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73 71  een busy */.  sq
d560: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
d570: 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e      /* The fi
d580: 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20  le on which the 
d590: 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20 2a 2f  lock occurred */
d5a0: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
d5b0: 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53  S_WIN || HAVE_US
d5c0: 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73 20 63  LEEP.  /* This c
d5d0: 61 73 65 20 69 73 20 66 6f 72 20 73 79 73 74 65  ase is for syste
d5e0: 6d 73 20 74 68 61 74 20 68 61 76 65 20 73 75 70  ms that have sup
d5f0: 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70 69 6e  port for sleepin
d600: 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e 73 20  g for fractions 
d610: 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64  of.  ** a second
d620: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 41 6c  .  Examples:  Al
d630: 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  l windows system
d640: 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20  s, unix systems 
d650: 77 69 74 68 20 75 73 6c 65 65 70 28 29 20 2a 2f  with usleep() */
d660: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d670: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
d680: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
d690: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
d6a0: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
d6b0: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
d6c0: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
d6d0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
d6e0: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
d6f0: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
d700: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
d710: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
d720: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
d730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d740: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
d750: 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 64  .  int tmout = d
d760: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
d770: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
d780: 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  or;..#ifdef SQLI
d790: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
d7a0: 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20 73 71  TIMEOUT.  if( sq
d7b0: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
d7c0: 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54 45 5f  ol(pFile,SQLITE_
d7d0: 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f  FCNTL_LOCK_TIMEO
d7e0: 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c 49  UT,&tmout)==SQLI
d7f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
d800: 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20   count ){.      
d810: 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  tmout = 0;.     
d820: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
d830: 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c  ntrol(pFile, SQL
d840: 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54  ITE_FCNTL_LOCK_T
d850: 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29 3b  IMEOUT, &tmout);
d860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
d870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d880: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d890: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d8a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d8b0: 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
d8c0: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
d8d0: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
d8e0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
d8f0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
d900: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
d910: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
d920: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
d930: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
d940: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
d950: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
d960: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
d970: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
d980: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
d990: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f 75  r + delay > tmou
d9a0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
d9b0: 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a   tmout - prior;.
d9c0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
d9d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
d9e0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d9f0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
da00: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
da10: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  n 1;.#else.  /* 
da20: 54 68 69 73 20 63 61 73 65 20 66 6f 72 20 75 6e  This case for un
da30: 69 78 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  ix systems that 
da40: 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20 73 75  lack usleep() su
da50: 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e 67  pport.  Sleeping
da60: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 64 6f  .  ** must be do
da70: 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ne in increments
da80: 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e 64   of whole second
da90: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
daa0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
dab0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74  ptr;.  int tmout
dac0: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
dad0: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
dae0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
daf0: 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20 20 69  ETER(pFile);.  i
db00: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
db10: 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20  0 > tmout ){.   
db20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
db30: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
db40: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
db50: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
db60: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
db70: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
db80: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
db90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dba0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
dbb0: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
dbc0: 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  iled to acquire 
dbd0: 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46 53  a.** lock on VFS
dbe0: 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a   file pFile..**.
dbf0: 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
dc00: 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ne returns non-z
dc10: 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
dc20: 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74   retried.  If it
dc30: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74  .** returns 0, t
dc40: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f  he operation abo
dc50: 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  rts with an SQLI
dc60: 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a  TE_BUSY error..*
dc70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76  /.int sqlite3Inv
dc80: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42  okeBusyHandler(B
dc90: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20 73  usyHandler *p, s
dca0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
dcb0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
dcc0: 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48 61 6e   if( p->xBusyHan
dcd0: 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  dler==0 || p->nB
dce0: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
dcf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78 74 72  ;.  if( p->bExtr
dd00: 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20 20 20  aFileArg ){.    
dd10: 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72 61 20  /* Add an extra 
dd20: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
dd30: 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74 65 72  he pFile pointer
dd40: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
dd50: 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61  he.    ** callba
dd60: 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  ck argument list
dd70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78 54   */.    int (*xT
dd80: 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71  ra)(void*,int,sq
dd90: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20 20  lite3_file*);.  
dda0: 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28 2a 29    xTra = (int(*)
ddb0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74  (void*,int,sqlit
ddc0: 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42 75  e3_file*))p->xBu
ddd0: 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 72  syHandler;.    r
dde0: 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42 75 73  c = xTra(p->pBus
ddf0: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c 20  yArg, p->nBusy, 
de00: 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pFile);.  }else{
de10: 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79 20 73  .    /* Legacy s
de20: 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64 6c 65  tyle busy handle
de30: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
de40: 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73 79 48    rc = p->xBusyH
de50: 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73 79 41  andler(p->pBusyA
de60: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20  rg, p->nBusy);. 
de70: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
de80: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
de90: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
dea0: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
deb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
dec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ded0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
dee0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
def0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
df00: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
df10: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
df20: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
df30: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
df40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
df50: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
df60: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
df70: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
df80: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
df90: 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  rg.){.#ifdef SQL
dfa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
dfb0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
dfc0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
dfd0: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
dfe0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
dff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
e000: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
e010: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
e020: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 42 75  >busyHandler.xBu
e030: 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
e040: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
e050: 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20 3d 20  dler.pBusyArg = 
e060: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
e070: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
e080: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  0;.  db->busyHan
e090: 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41  dler.bExtraFileA
e0a0: 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75  rg = 0;.  db->bu
e0b0: 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20  syTimeout = 0;. 
e0c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e0d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
e0e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e0f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
e100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
e110: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
e120: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e130: 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65   sets the progre
e140: 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ss callback for 
e150: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
e160: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
e170: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
e180: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
e190: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ven argument. Th
e1a0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
e1b0: 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69  ack will.** be i
e1c0: 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70  nvoked every nOp
e1d0: 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f  s opcodes..*/.vo
e1e0: 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72  id sqlite3_progr
e1f0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  ess_handler(.  s
e200: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
e210: 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28  nt nOps,.  int (
e220: 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64  *xProgress)(void
e230: 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  *), .  void *pAr
e240: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
e250: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e260: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e270: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e280: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
e290: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e2a0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
e2b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
e2c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e2d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e2e0: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
e2f0: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
e300: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
e310: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
e320: 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f  s = (unsigned)nO
e330: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
e340: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
e350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
e360: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
e370: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
e380: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
e390: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
e3a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
e3b0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e3c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
e3d0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
e3e0: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
e3f0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
e400: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
e410: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
e420: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
e430: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
e440: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
e450: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
e460: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
e470: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e480: 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   ms){.#ifdef SQL
e490: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e4a0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e4b0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e4c0: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
e4d0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e4e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d  ;.#endif.  if( m
e4f0: 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  s>0 ){.    sqlit
e500: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e510: 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69 64  db, (int(*)(void
e520: 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44 65 66  *,int))sqliteDef
e530: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
e540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e560: 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64  void*)db);.    d
e570: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
e580: 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73   ms;.    db->bus
e590: 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46  yHandler.bExtraF
e5a0: 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d 65  ileArg = 1;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
e5c0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
e5d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
e5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
e600: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
e610: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
e620: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
e630: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
e640: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
e650: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
e660: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e670: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e680: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e690: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e6a0: 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64  ) && (db==0 || d
e6b0: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
e6c0: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29  _MAGIC_ZOMBIE) )
e6d0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
e6e0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e6f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e700: 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e  #endif.  db->u1.
e710: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
e720: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
e730: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
e740: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
e750: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
e760: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
e770: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
e780: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
e790: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
e7a0: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
e7b0: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
e7c0: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
e7d0: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
e7e0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e7f0: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
e800: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
e810: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
e820: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
e830: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
e840: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e850: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e860: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e870: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
e880: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e890: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
e8a0: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
e8b0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e8c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e8d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e8e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e8f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e900: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e910: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e920: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e930: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
e940: 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c  id (*xValue)(sql
e950: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
e960: 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73    void (*xInvers
e970: 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e)(sqlite3_conte
e980: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e990: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75 6e  value **),.  Fun
e9a0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
e9b0: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
e9c0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
e9d0: 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74  nName;.  int ext
e9e0: 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65  raFlags;..  asse
e9f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ea00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
ea10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78  ) );.  assert( x
ea20: 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46 75  Value==0 || xSFu
ea30: 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  nc==0 );.  if( z
ea40: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea60: 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20 76 61  * Must have a va
ea70: 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c  lid name */.   |
ea80: 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26 26 20  | (xSFunc!=0 && 
ea90: 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20 20 20  xFinal!=0)      
eaa0: 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78 53    /* Not both xS
eab0: 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c 20  Func and xFinal 
eac0: 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e 61  */.   || ((xFina
ead0: 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d 30  l==0)!=(xStep==0
eae0: 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f 74 68  ))       /* Both
eaf0: 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78   or neither of x
eb00: 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65 70 20  Final and xStep 
eb10: 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c 75  */.   || ((xValu
eb20: 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72 73 65  e==0)!=(xInverse
eb30: 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f 74 68  ==0))    /* Both
eb40: 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78   or neither of x
eb50: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 20  Value, xInverse 
eb60: 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c 2d  */.   || (nArg<-
eb70: 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45  1 || nArg>SQLITE
eb80: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
eb90: 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28 6e  G).   || (255<(n
eba0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
ebb0: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
ebc0: 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20 20  nName))).  ){.  
ebd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ebe0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
ebf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
ec00: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
ec10: 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  ==SQLITE_DETERMI
ec20: 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72  NISTIC );.  extr
ec30: 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20  aFlags = enc &  
ec40: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
ec50: 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28  STIC;.  enc &= (
ec60: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
ec70: 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b  ASK|SQLITE_ANY);
ec80: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
ec90: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
eca0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
ecb0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
ecc0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
ecd0: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
ece0: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
ecf0: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
ed00: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
ed10: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
ed20: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
ed30: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
ed40: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
ed50: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
ed60: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
ed70: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
ed80: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
ed90: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
eda0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
edb0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
edc0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
edd0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
ede0: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
edf0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
ee00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
ee10: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
ee20: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
ee30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
ee40: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
ee50: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
ee60: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74   SQLITE_UTF8|ext
ee70: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
ee80: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46    pUserData, xSF
ee90: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
eea0: 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76  al, xValue, xInv
eeb0: 65 72 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f  erse, pDestructo
eec0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
eed0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eee0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
eef0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
ef00: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
ef10: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
ef20: 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  E|extraFlags,.  
ef30: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
ef40: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
ef50: 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65  , xFinal, xValue
ef60: 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73  , xInverse, pDes
ef70: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
ef80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ef90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
efa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
efb0: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
efc0: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
efd0: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
efe0: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
eff0: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
f000: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
f010: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
f020: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
f030: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
f040: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
f050: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
f060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
f070: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
f080: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
f090: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
f0a0: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
f0b0: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
f0c0: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
f0d0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
f0e0: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
f0f0: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
f100: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
f110: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
f120: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
f130: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
f140: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
f150: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
f160: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
f170: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
f180: 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63 20  MASK)==(u32)enc 
f190: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
f1a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
f1b0: 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
f1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f1d0: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
f1e0: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
f1f0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
f200: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
f210: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
f220: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
f230: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
f240: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
f250: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
f260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
f270: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
f280: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
f290: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
f2a0: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
f2b0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
f2c0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
f2d0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
f2e0: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
f2f0: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
f300: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
f310: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
f320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
f350: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
f360: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
f370: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
f380: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
f390: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
f3a0: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
f3b0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
f3c0: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
f3d0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
f3e0: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
f3f0: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
f400: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
f410: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e  f++;.  }.  p->u.
f420: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
f430: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
f440: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
f450: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f460: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
f470: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
f480: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
f490: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
f4a0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
f4b0: 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20  ;.  p->xSFunc = 
f4c0: 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20  xSFunc ? xSFunc 
f4d0: 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  : xStep;.  p->xF
f4e0: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
f4f0: 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d 20  ;.  p->xValue = 
f500: 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49 6e  xValue;.  p->xIn
f510: 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73 65  verse = xInverse
f520: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
f530: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
f540: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
f550: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
f560: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f570: 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f  * Worker functio
f580: 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d 38 20  n used by utf-8 
f590: 41 50 49 73 20 74 68 61 74 20 63 72 65 61 74 65  APIs that create
f5a0: 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a 0a   new functions:.
f5b0: 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
f5c0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
f5d0: 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ().**    sqlite3
f5e0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
f5f0: 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69  _v2().**    sqli
f600: 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f  te3_create_windo
f610: 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a  w_function().*/.
f620: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
f630: 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20 20  eFunctionApi(.  
f640: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
f650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
f660: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
f670: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
f680: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
f690: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
f6a0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
f6b0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
f6c0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
f6d0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
f6e0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
f6f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
f700: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
f710: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
f720: 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f  xValue)(sqlite3_
f730: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
f740: 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71  d (*xInverse)(sq
f750: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f760: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f770: 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  **),.  void(*xDe
f780: 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29 7b  stroy)(void*).){
f790: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f7a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63  TE_ERROR;.  Func
f7b0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67  Destructor *pArg
f7c0: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
f7d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
f7e0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
f7f0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
f800: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f810: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
f820: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
f830: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f840: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f850: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
f860: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
f870: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
f880: 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
f890: 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  c(sizeof(FuncDes
f8a0: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
f8b0: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
f8c0: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
f8d0: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65  t(db);.      xDe
f8e0: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
f8f0: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
f900: 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d      pArg->nRef =
f910: 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44   0;.    pArg->xD
f920: 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f  estroy = xDestro
f930: 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73  y;.    pArg->pUs
f940: 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a  erData = p;.  }.
f950: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
f960: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
f970: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
f980: 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63 2c  , .      xSFunc,
f990: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
f9a0: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
f9b0: 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69 66  , pArg.  );.  if
f9c0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
f9d0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
f9e0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
f9f0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
fa00: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
fa10: 69 74 65 33 5f 66 72 65 65 28 70 41 72 67 29 3b  ite3_free(pArg);
fa20: 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63  .  }.. out:.  rc
fa30: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
fa40: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
fa50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fa60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fa70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fa80: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
fa90: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
faa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
fab0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
fac0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
fad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
fae0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
faf0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
fb00: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
fb10: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
fb20: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fb30: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
fb40: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
fb50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fb60: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fb70: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
fb80: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
fb90: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74  ntext*).){.  ret
fba0: 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69  urn createFuncti
fbb0: 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c  onApi(db, zFunc,
fbc0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
fbd0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  SFunc, xStep,.  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20    xFinal, 0, 0, 
fc10: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
fc20: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
fc30: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
fc40: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
fc50: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
fc60: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
fc70: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fc80: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
fc90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fca0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fcb0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
fcc0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
fcd0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fce0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
fcf0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
fd00: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
fd10: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
fd20: 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  oy)(void *).){. 
fd30: 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75   return createFu
fd40: 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46  nctionApi(db, zF
fd50: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
fd60: 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  p, xSFunc, xStep
fd70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c        xFinal, 0,
fda0: 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d   0, xDestroy);.}
fdb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
fdc0: 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74  ate_window_funct
fdd0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
fde0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
fdf0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
fe00: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
fe10: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
fe20: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
fe30: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
fe40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fe50: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
fe60: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
fe70: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
fe80: 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f  xValue)(sqlite3_
fe90: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
fea0: 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71  d (*xInverse)(sq
feb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fec0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fed0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fee0: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
fef0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65  .){.  return cre
ff00: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64  ateFunctionApi(d
ff10: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
ff20: 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65 70  enc, p, 0, xStep
ff30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78 56        xFinal, xV
ff60: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20  alue, xInverse, 
ff70: 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69  xDestroy);.}..#i
ff80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ff90: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
ffa0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
ffb0: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
ffc0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
ffd0: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
ffe0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
fff0: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
10000 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
10010 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
10020 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
10030 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
10040 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
10050 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
10060 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
10070 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
10080 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
10090 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
100a0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
100b0 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66  *zFunc8;..#ifdef
100c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
100d0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
100e0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
100f0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e  ckOk(db) || zFun
10100 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72  ctionName==0 ) r
10110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10120 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
10130 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10140 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
10160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10170 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
10180 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
10190 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
101a0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
101b0 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
101c0 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
101d0 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
101e0 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
101f0 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46   xSFunc,xStep,xF
10200 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20 73  inal,0,0,0);.  s
10210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10220 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
10230 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
10240 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
10250 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10260 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10270 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
10280 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
10290 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d  lowing is the im
102a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
102b0 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  an SQL function 
102c0 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66  that always.** f
102d0 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72  ails with an err
102e0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61 74 69  or message stati
102f0 6e 67 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  ng that the func
10300 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20  tion is used in 
10310 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e  the.** wrong con
10320 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74  text.  The sqlit
10330 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
10340 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74  tion() API might
10350 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51   construct.** SQ
10360 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  L function that 
10370 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
10380 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
10390 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73  ctions will exis
103a0 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65  t.** for name re
103b0 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65  solution but are
103c0 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f   actually overlo
103d0 61 64 65 64 20 62 79 20 74 68 65 20 78 46 69 6e  aded by the xFin
103e0 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74  dFunction.** met
103f0 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74  hod of virtual t
10400 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
10410 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76   void sqlite3Inv
10420 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  alidFunction(.  
10430 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
10440 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68  *context,  /* Th
10450 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69  e function calli
10460 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10470 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20  int NotUsed,    
10480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10490 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
104a0 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
104b0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
104c0 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20  alue **NotUsed2 
104d0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61    /* Value of ea
104e0 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
104f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
10500 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
10510 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  har*)sqlite3_use
10520 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
10530 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
10540 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10550 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10560 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20  sed2);.  zErr = 
10570 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10580 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74  .      "unable t
10590 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25  o use function %
105a0 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
105b0 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61  ed context", zNa
105c0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  me);.  sqlite3_r
105d0 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
105e0 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a  ext, zErr, -1);.
105f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10600 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
10610 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
10620 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
10630 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
10640 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
10650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
10660 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
10670 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
10680 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
10690 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
106a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
106b0 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
106c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
106d0 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
106e0 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
106f0 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
10700 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
10710 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
10720 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
10730 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
10740 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
10750 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
10760 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
10770 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
10780 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
10790 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
107a0 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
107b0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
107c0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
107d0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
107e0 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
107f0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
10800 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
10810 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
10820 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
10830 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
10840 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63  nArg.){.  int rc
10850 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b  ;.  char *zCopy;
10860 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10870 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10880 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10890 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
108a0 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20   || zName==0 || 
108b0 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72  nArg<-2 ){.    r
108c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
108d0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
108e0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
108f0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10900 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71  utex);.  rc = sq
10910 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
10920 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  n(db, zName, nAr
10930 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
10940 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  0)!=0;.  sqlite3
10950 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10960 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72  >mutex);.  if( r
10970 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  c ) return SQLIT
10980 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20  E_OK;.  zCopy = 
10990 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
109a0 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  zName);.  if( zC
109b0 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  opy==0 ) return 
109c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
109d0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
109e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
109f0 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  2(db, zName, nAr
10a00 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79             zCopy
10a30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
10a40 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
10a50 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d  sqlite3_free);.}
10a60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10a70 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
10a80 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
10a90 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
10aa0 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
10ab0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
10ac0 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
10ad0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
10ae0 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
10af0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
10b00 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
10b10 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
10b20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
10b30 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
10b40 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
10b50 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
10b60 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
10b70 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
10b80 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nt..*/.#ifndef S
10b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
10ba0 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69  CATED.void *sqli
10bb0 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65  te3_trace(sqlite
10bc0 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72  3 *db, void(*xTr
10bd0 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
10be0 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
10bf0 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
10c00 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
10c10 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10c20 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10c30 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10c40 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10c50 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10c60 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
10c70 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10c90 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10ca0 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
10cb0 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54  aceArg;.  db->mT
10cc0 72 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20  race = xTrace ? 
10cd0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47  SQLITE_TRACE_LEG
10ce0 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78  ACY : 0;.  db->x
10cf0 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28  Trace = (int(*)(
10d00 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  u32,void*,void*,
10d10 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20  void*))xTrace;. 
10d20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
10d30 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
10d40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10d50 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10d60 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
10d70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10d80 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f  DEPRECATED */../
10d90 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
10da0 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  ce callback usin
10db0 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20  g the version-2 
10dc0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
10dd0 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f  t sqlite3_trace_
10de0 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
10df0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63   /* Trace this c
10e20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  onnection */.  u
10e30 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20  nsigned mTrace, 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
10e60 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62  k of events to b
10e70 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e  e traced */.  in
10e80 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67  t(*xTrace)(unsig
10e90 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ned,void*,void*,
10ea0 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c  void*),  /* Call
10eb0 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a  back to invoke *
10ec0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ef0 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  * Context */.){.
10f00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10f10 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10f20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10f30 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10f40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10f50 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10f60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10f70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10f80 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10f90 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20  if( mTrace==0 ) 
10fa0 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66  xTrace = 0;.  if
10fb0 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54  ( xTrace==0 ) mT
10fc0 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  race = 0;.  db->
10fd0 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b  mTrace = mTrace;
10fe0 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
10ff0 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
11000 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
11010 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11020 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11030 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11040 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
11050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
11060 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65  RECATED./*.** Re
11070 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
11080 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
11090 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
110a0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
110b0 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
110c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
110d0 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
110e0 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
110f0 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
11100 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
11110 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
11120 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
11130 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
11140 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
11150 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
11160 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
11170 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
11180 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
11190 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
111a0 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
111b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
111c0 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
111d0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
111e0 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
111f0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
11200 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
11210 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11220 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
11230 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
11240 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
11250 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
11260 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
11270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
11280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
11290 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
112a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
112b0 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
112c0 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
112d0 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
112e0 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
112f0 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
11300 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c 49  ->mTrace &= SQLI
11310 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47 41  TE_TRACE_NONLEGA
11320 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 64  CY_MASK;.  if( d
11330 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64 62  b->xProfile ) db
11340 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c 49  ->mTrace |= SQLI
11350 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49 4c  TE_TRACE_XPROFIL
11360 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  E;.  sqlite3_mut
11370 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11380 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
11390 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
113a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
113b0 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66  ECATED */.#endif
113c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
113d0 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
113e0 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
113f0 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
11400 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
11410 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a  tion commits..**
11420 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
11430 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11440 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
11450 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
11460 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
11470 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
11480 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
11490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
114a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
114b0 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
114c0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
114d0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
114e0 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
114f0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
11500 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
11510 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
11520 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
11530 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
11540 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
11550 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
11560 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
11570 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11580 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
11590 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
115a0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
115b0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
115c0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
115d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
115e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
115f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11600 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
11610 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
11620 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
11630 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11640 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
11650 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11660 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11670 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11680 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
11690 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
116a0 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
116b0 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
116c0 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
116d0 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
116e0 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
116f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11700 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
11710 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
11720 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11740 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
11750 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
11760 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
11770 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
11780 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
11790 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
117a0 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
117b0 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
117c0 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
117d0 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
117e0 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
117f0 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
11800 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
11810 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
11820 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11830 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
11840 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
11850 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
11860 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
11870 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11880 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
11890 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
118a0 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
118b0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
118c0 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
118d0 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
118e0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
118f0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11900 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11910 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
11920 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
11930 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
11940 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
11950 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
11960 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
11970 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
11980 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
11990 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
119a0 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
119b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
119c0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
119d0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
119e0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
119f0 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
11a00 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
11a10 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
11a20 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a40 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
11a50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
11a60 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
11a70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11a80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
11a90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11aa0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
11ab0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
11ac0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11ad0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11ae0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11af0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11b00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
11b10 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
11b20 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
11b30 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
11b40 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
11b50 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
11b60 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
11b70 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11b80 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11b90 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  pRet;.}..#ifdef 
11ba0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
11bb0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
11bc0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
11bd0 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
11be0 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
11bf0 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
11c00 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
11c10 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
11c20 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
11c30 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
11c40 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  *sqlite3_preupda
11c50 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
11c60 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11c70 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
11c80 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
11c90 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
11ca0 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20  id(*xCallback)( 
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
11cc0 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
11cd0 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65      void*,sqlite
11ce0 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  3*,int,char cons
11cf0 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73  t*,char const*,s
11d00 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c  qlite3_int64,sql
11d10 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76  ite3_int64),.  v
11d20 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
11d30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11d40 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  t callback argum
11d50 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ent */.){.  void
11d60 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
11d70 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11d80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
11d90 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74   = db->pPreUpdat
11da0 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65  eArg;.  db->xPre
11db0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
11dc0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11dd0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20  ->pPreUpdateArg 
11de0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
11df0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11e00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11e10 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
11e20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
11e30 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
11e40 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
11e50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
11e60 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
11e70 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
11e80 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
11e90 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
11ea0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
11eb0 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
11ec0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
11ed0 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
11ee0 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
11ef0 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
11f00 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
11f10 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
11f20 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
11f30 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
11f40 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
11f50 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
11f60 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
11f70 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
11f80 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
11f90 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
11fa0 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
11fb0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11fc0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
11fd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11fe0 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
11ff0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
12000 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
12010 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
12020 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
12030 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
12040 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
12050 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
12060 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
12070 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
12080 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
12090 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
120a0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
120b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
120c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
120d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
120e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
120f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
12100 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
12110 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
12120 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
12130 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
12140 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
12150 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
12160 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
12170 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
12180 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
12190 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
121a0 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
121b0 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
121c0 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
121d0 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
121e0 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
121f0 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
12200 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
12210 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
12220 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
12230 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
12240 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
12250 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
12260 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
12270 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
12280 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
12290 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
122a0 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
122b0 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
122c0 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
122d0 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
122e0 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
122f0 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
12300 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
12310 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
12320 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
12330 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
12340 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12350 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
12360 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
12370 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12380 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
12390 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54  lse.#ifdef SQLIT
123a0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
123b0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
123c0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
123d0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
123e0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
123f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72  #endif.  if( nFr
12400 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
12410 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
12420 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
12430 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
12440 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
12450 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
12460 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
12470 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
12480 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
12490 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
124a0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
124b0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
124c0 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
124d0 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
124e0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
124f0 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
12500 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
12510 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12520 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
12530 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
12540 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
12570 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
12580 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
12590 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
125a0 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
125b0 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
125c0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
125f0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
12600 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
12610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12620 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
12630 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  pRet;.#ifdef SQL
12640 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
12650 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
12660 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12670 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
12680 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
12690 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
126a0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
126b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
126c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
126d0 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
126e0 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
126f0 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
12700 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
12710 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
12720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12730 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12740 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
12750 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
12760 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12770 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
12780 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
12790 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
127a0 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
127b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127d0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
127e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
127f0 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
12800 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
12810 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
12820 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
12830 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
12860 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
12870 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
128a0 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
128b0 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
128c0 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
128d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
128e0 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
128f0 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
12900 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
12910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
12920 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
12930 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
12940 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12960 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
12970 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
12980 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
12990 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
129a0 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
129b0 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
129c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
129d0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
129e0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
129f0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
12a00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12a10 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
12a20 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
12a30 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
12a40 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
12a50 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
12a60 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
12a70 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
12a80 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
12a90 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
12aa0 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
12ab0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12ac0 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a  T_PASSIVE==0 );.
12ad0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
12ae0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
12af0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
12b00 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12b10 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b  NT_RESTART==2 );
12b20 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
12b30 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
12b40 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66  NCATE==3 );.  if
12b50 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
12b60 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
12b70 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
12b80 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
12b90 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  NCATE ){.    /* 
12ba0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
12bb0 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d  3996-12088 The M
12bc0 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
12bd0 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  be a valid check
12be0 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64  point.    ** mod
12bf0 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e: */.    return
12c00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
12c10 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
12c20 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12c30 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
12c40 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20   && zDb[0] ){.  
12c50 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
12c60 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
12c70 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  b);.  }.  if( iD
12c80 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  b<0 ){.    rc = 
12c90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
12ca0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
12cb0 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
12cc0 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
12cd0 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
12ce0 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
12cf0 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c     db->busyHandl
12d00 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
12d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
12d20 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
12d30 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
12d40 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
12d50 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
12d60 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
12d70 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
12d80 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   rc);..  /* If t
12d90 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
12da0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63  ve statements, c
12db0 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75  lear the interru
12dc0 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a  pt flag at this.
12dd0 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a    ** point.  */.
12de0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
12df0 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ctive==0 ){.    
12e00 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
12e10 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pted = 0;.  }.. 
12e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12e30 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
12e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12e50 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
12e60 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
12e70 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
12e80 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
12e90 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
12ea0 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
12eb0 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
12ec0 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
12ed0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
12ee0 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
12ef0 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
12f00 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
12f10 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
12f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12f30 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
12f40 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
12f50 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
12f60 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
12f70 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
12f80 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
12f90 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
12fa0 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
12fb0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12fc0 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
12fd0 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
12fe0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
12ff0 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
13000 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
13010 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
13020 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
13030 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
13040 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
13050 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
13060 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
13070 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
13080 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
13090 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
130a0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
130b0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
130c0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
130d0 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
130e0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
130f0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
13100 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
13110 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
13120 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
13130 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
13140 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
13150 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
13160 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
13170 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
13180 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
13190 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
131a0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
131b0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
131c0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
131d0 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
131e0 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
131f0 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
13200 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13210 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
13220 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
13230 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
13240 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
13250 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
13260 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
13270 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
13280 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
13290 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
132a0 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
132b0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
132c0 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
132d0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
132e0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
132f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
13300 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
13310 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
13320 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
13330 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
13340 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
13350 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
13360 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
13370 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
13380 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54  E, FULL, RESTART
13390 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e  .** or TRUNCATE.
133a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
133b0 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
133c0 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
133d0 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
133e0 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
133f0 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
13400 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13410 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
13420 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
13430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13450 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
13460 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
13470 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
13480 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
13490 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
134a0 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
134b0 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
134c0 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
134d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
134e0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
134f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
13500 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
13510 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
13520 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
13530 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
13540 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
13550 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
13560 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
13570 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
13580 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13590 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
135a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
135b0 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
135c0 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
135d0 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
135e0 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
135f0 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
13600 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13610 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
13620 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
13630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
13640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
13650 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13660 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13670 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
13680 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
13690 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
136a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
136b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
136c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
136d0 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
136e0 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
136f0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
13700 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
13710 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
13720 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
13730 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
13740 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
13750 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
13760 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
13770 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
13780 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
13790 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
137a0 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
137b0 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
137c0 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
137d0 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
137e0 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
137f0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
13800 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
13810 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
13820 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
13830 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
13840 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
13850 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
13860 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
13870 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
13880 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
13890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
138a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
138b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138d0 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
138f0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
13900 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
13910 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
13940 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
13950 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13980 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13990 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
139a0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
139b0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
139c0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
139d0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
139e0 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
139f0 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
13a10 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
13a20 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
13a60 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13a90 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
13aa0 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
13ad0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
13ae0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
13af0 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
13b00 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
13b10 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
13b20 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13b30 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
13b40 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
13b50 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
13b60 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13b70 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
13b80 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
13b90 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
13ba0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
13bb0 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  =3.  UNUSED_PARA
13bc0 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
13bd0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
13be0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
13bf0 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
13c00 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55  TEMP_STORE>3.  U
13c10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13c20 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  db);.  return 0;
13c30 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13c40 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
13c50 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
13c60 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
13c70 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
13c80 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
13c90 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
13ca0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
13cb0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
13cc0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
13cd0 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
13ce0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
13cf0 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  tr(SQLITE_NOMEM_
13d00 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  BKPT);.  }.  if(
13d10 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
13d20 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
13d30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
13d40 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
13d50 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
13d60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
13d70 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13d80 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
13d90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13da0 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
13db0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
13dc0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65  OMEM_BKPT);.  }e
13dd0 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73  lse{.    testcas
13de0 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  e( db->pErr==0 )
13df0 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65 72  ;.    z = db->er
13e00 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29 73  rCode ? (char*)s
13e10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13e20 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30 3b  t(db->pErr) : 0;
13e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
13e40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13e50 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
13e60 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
13e70 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
13e80 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
13e90 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13ea0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13eb0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
13ec0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13ed0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
13ee0 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
13ef0 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
13f00 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
13f10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
13f20 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
13f30 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
13f40 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
13f50 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
13f60 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
13f70 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
13f80 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
13f90 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
13fa0 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
13fb0 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
13fc0 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
13fd0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
13fe0 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
13ff0 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27     'b', 'a', 'd'
14000 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c  , ' ', 'p', 'a',
14010 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20   'r', 'a', 'm', 
14020 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27  'e', 't', 'e', '
14030 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27  r', ' ',.    'o'
14040 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 'r', ' ', 'o',
14050 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20   't', 'h', 'e', 
14060 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27  'r', ' ', 'A', '
14070 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20  P', 'I', ' ',.  
14080 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c    'm', 'i', 's',
14090 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20   'u', 's', 'e', 
140a0 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
140b0 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
140c0 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
140d0 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
140e0 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
140f0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
14100 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
14110 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
14120 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
14130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14140 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
14150 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14160 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
14170 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
14180 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
14190 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
141a0 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
141b0 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
141c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
141d0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
141e0 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c  db, db->errCode,
141f0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
14200 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20  b->errCode));.  
14210 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
14220 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
14230 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
14240 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
14250 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
14260 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
14270 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
14280 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
14290 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
142a0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
142b0 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
142c0 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
142d0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
142e0 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
142f0 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
14300 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
14310 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
14320 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
14330 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
14340 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
14350 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
14360 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
14370 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61    sqlite3OomClea
14380 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r(db);.  }.  sql
14390 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
143a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
143b0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
143c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
143d0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
143e0 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
143f0 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
14400 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
14410 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
14420 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
14430 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
14440 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
14450 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
14460 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
14470 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
14480 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
14490 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
144a0 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
144b0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
144c0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
144d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
144e0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
144f0 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
14500 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14510 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
14520 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14530 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
14540 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
14550 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
14560 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
14570 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
14580 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
14590 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
145a0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
145b0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
145c0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
145d0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
145e0 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
145f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
14600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14610 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
14620 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
14630 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
14640 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71  _system_errno(sq
14650 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
14660 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53  turn db ? db->iS
14670 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20  ysErrno : 0;.}  
14680 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14690 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
146a0 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
146b0 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
146c0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
146d0 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c  ument.  For now,
146e0 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c   this simply cal
146f0 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ls the internal 
14700 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a  sqlite3ErrStr().
14710 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
14720 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
14730 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72  te3_errstr(int r
14740 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  c){.  return sql
14750 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a  ite3ErrStr(rc);.
14760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
14770 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
14780 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
14790 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
147a0 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
147b0 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
147c0 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
147d0 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
147e0 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
147f0 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
14800 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
14810 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
14820 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
14830 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
14840 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
14850 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
14860 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
14870 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
14880 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
14890 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72  enc2;.  .  asser
148a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
148b0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
148c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
148d0 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
148e0 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
148f0 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
14900 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
14910 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
14920 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
14930 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
14940 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
14950 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
14960 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
14970 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
14980 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
14990 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74   enc2 = enc;.  t
149a0 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
149b0 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20  QLITE_UTF16 );. 
149c0 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
149d0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
149e0 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65  IGNED );.  if( e
149f0 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
14a00 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54  6 || enc2==SQLIT
14a10 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
14a20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
14a30 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
14a40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32  ;.  }.  if( enc2
14a50 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  <SQLITE_UTF8 || 
14a60 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31  enc2>SQLITE_UTF1
14a70 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  6BE ){.    retur
14a80 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
14a90 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
14aa0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
14ab0 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f  ll is removing o
14ac0 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65  r replacing an e
14ad0 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  xisting collatio
14ae0 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  n .  ** sequence
14af0 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65  . If so, and the
14b00 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
14b10 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20  s, return busy. 
14b20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  If there.  ** ar
14b30 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
14b40 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
14b50 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
14b60 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
14b70 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
14b80 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
14b90 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
14ba0 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
14bb0 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14bc0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
14bd0 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
14be0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
14bf0 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
14c00 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
14c10 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
14c20 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
14c30 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
14c40 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
14c50 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
14c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
14c70 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
14c80 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
14c90 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
14ca0 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   0);..    /* If 
14cb0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14cc0 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
14cd0 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
14ce0 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
14cf0 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
14d00 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
14d10 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
14d20 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
14d30 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
14d40 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
14d50 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
14d60 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
14d70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
14d80 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
14d90 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
14da0 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
14db0 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
14dc0 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
14dd0 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
14de0 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
14df0 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
14e00 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
14e10 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
14e20 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
14e30 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
14e40 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
14e50 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
14e60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
14e70 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
14e80 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
14e90 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
14ea0 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
14eb0 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
14ec0 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
14ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
14ee0 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
14ef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14f00 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
14f10 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14f30 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14f40 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14f50 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
14f60 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
14f70 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
14f80 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14f90 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
14fa0 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
14fb0 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
14fc0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
14fd0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
14fe0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
14ff0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
15000 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
15010 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
15020 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
15030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15040 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
15050 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
15060 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
15070 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
15080 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
15090 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
150a0 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
150b0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
150c0 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
150d0 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
150e0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
150f0 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
15100 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
15110 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
15120 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
15130 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
15140 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
15150 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
15160 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
15170 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
15180 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
15190 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
151a0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
151b0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
151c0 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
151d0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
151e0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
151f0 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
15200 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
15210 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
15220 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
15230 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
15240 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
15250 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
15260 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15270 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
15280 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
15290 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
152a0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
152b0 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
152c0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
152d0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
152e0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
152f0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
15300 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
15310 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15320 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
15330 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
15340 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
15350 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15360 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
15370 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
15380 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15390 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
153a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
153b0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
153c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
153d0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
153e0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
153f0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
15400 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
15410 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
15420 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15430 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
15440 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
15450 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
15460 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
15470 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15480 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
15490 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
154a0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
154b0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
154c0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
154d0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
154e0 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
154f0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
15500 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
15510 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15520 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
15530 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15540 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
15550 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
15560 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15570 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
15580 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
15590 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
155a0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
155b0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
155c0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
155d0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
155e0 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
155f0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
15600 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
15610 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
15620 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
15630 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
15640 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
15650 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
15660 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
15670 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
15680 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
15690 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
156a0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
156b0 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
156c0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
156d0 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
156e0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
156f0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
15700 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
15710 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
15720 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
15730 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
15740 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
15750 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
15760 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
15770 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
15780 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
15790 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
157a0 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
157b0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
157c0 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
157d0 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
157e0 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
157f0 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
15800 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
15810 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
15820 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
15830 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
15840 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
15850 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
15860 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
15870 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
15880 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
15890 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
158a0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
158b0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
158c0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
158d0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
158e0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
158f0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
15900 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
15910 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
15920 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
15930 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
15940 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
15950 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
15960 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
15970 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
15980 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
15990 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
159a0 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
159b0 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
159c0 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
159d0 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
159e0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
159f0 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
15a00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
15a10 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15a20 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
15a30 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
15a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15a50 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15a60 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
15a70 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
15a80 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
15a90 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15aa0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
15ab0 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
15ac0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
15ad0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15ae0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
15af0 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
15b00 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
15b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15b20 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15b30 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
15b40 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
15b50 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
15b60 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
15b70 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15b80 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
15b90 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
15ba0 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
15bb0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15bc0 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
15bd0 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
15be0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
15bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15c00 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15c10 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
15c20 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15c30 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
15c40 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15c50 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
15c60 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15ca0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
15cb0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
15cc0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15cd0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15ce0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
15cf0 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
15d00 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
15d10 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15d20 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15d30 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
15d40 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
15d50 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
15d60 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15d70 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15d80 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
15d90 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
15da0 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
15db0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15dc0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
15dd0 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
15de0 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
15df0 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
15e00 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
15e10 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
15e20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15e30 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
15e40 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
15e50 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
15e60 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15e70 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
15e80 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
15e90 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
15ea0 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
15eb0 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
15ec0 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
15ed0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
15ee0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
15ef0 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
15f00 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
15f10 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
15f20 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15f30 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f50 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
15f60 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
15f70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15f80 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
15f90 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
15fa0 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
15fb0 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
15fc0 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
15fd0 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
15fe0 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
15ff0 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
16000 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
16010 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
16020 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
16030 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
16040 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
16050 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
16060 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
16070 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
16080 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
16090 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
160a0 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
160b0 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
160c0 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
160d0 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
160e0 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
160f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
16100 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
16110 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
16120 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
16130 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
16140 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
16150 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
16160 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
16170 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
16180 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
16190 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
161a0 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
161b0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
161c0 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
161d0 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
161e0 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
161f0 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
16200 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
16210 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
16220 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
16230 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
16240 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
16250 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
16260 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
16270 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
16280 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
16290 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
162a0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
162b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
162c0 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
162d0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
162e0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
162f0 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
16300 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
16310 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
16320 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
16330 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
16340 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
16350 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
16360 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
16370 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
16380 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16390 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
163a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
163b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
163c0 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
163d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
163e0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
163f0 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
16400 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
16410 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
16420 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
16430 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
16440 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
16450 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
16460 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
16470 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
16480 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
16490 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
164a0 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
164b0 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
164c0 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
164d0 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
164e0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
164f0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16510 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
16520 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
16530 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
16540 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
16550 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
16560 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
16570 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
16580 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
16590 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
165a0 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
165b0 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
165e0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
165f0 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
16600 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
16610 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
16620 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
16630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
16640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
16650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16660 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
16670 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
16680 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
16690 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
166a0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
166b0 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
166c0 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
166d0 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
166e0 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
166f0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
16700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16710 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
16720 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
16730 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
16740 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
16750 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16760 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
16770 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
16780 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
16790 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
167a0 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
167b0 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
167c0 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
167d0 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
167e0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
16810 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
16820 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
16850 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
16860 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
16870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16880 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
16890 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
168a0 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
168b0 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
168c0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
168d0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
168e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
168f0 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
16900 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
16910 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
16920 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
16930 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
16940 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
16950 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
16960 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
16970 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
16980 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
16990 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
169a0 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
169b0 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
169c0 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
169d0 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
169e0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
169f0 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
16a00 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
16a10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16a20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
16a30 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
16a40 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
16a50 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
16a60 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
16a70 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
16a80 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16a90 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
16aa0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
16ab0 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
16ac0 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
16ad0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16ae0 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
16af0 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
16b00 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
16b10 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
16b20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
16b30 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
16b40 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
16b50 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
16b60 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
16b70 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
16b80 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
16b90 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
16ba0 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
16bb0 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
16bc0 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
16bd0 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
16be0 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
16bf0 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
16c00 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
16c10 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
16c20 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
16c30 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
16c40 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
16c50 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
16c60 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
16c70 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
16c80 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
16c90 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
16ca0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
16cb0 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
16cc0 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
16cd0 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
16ce0 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
16cf0 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
16d00 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16d10 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
16d20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
16d30 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
16d40 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
16d50 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
16d60 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
16d70 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
16d80 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
16d90 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16da0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
16db0 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
16dc0 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
16dd0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
16de0 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
16df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16e00 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
16e10 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
16e20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16e30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16e40 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
16e50 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
16e60 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
16e70 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
16e80 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
16e90 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
16ea0 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
16eb0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16ec0 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
16ed0 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
16ee0 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
16ef0 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
16f00 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
16f10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
16f20 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
16f30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16f40 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
16f50 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
16f60 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
16f70 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
16f80 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
16f90 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
16fa0 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
16fb0 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
16fc0 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
16fd0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
16fe0 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
16ff0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
17000 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
17010 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
17020 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
17030 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
17040 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
17050 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
17060 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
17070 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
17080 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
17090 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
170a0 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
170b0 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
170c0 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
170d0 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
170e0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
170f0 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
17100 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
17110 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
17120 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
17130 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66   octet==0 ){.#if
17140 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
17150 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a  LE_URI_00_ERROR.
17160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
17170 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
17180 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
17190 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
171a0 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
171b0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
171c0 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
171d0 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
171e0 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
171f0 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
17200 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
17210 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
17220 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
17230 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
17240 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
17250 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
17260 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
17270 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
17280 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
17290 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
172a0 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
172b0 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
172c0 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
172d0 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
172f0 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
17300 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
17310 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17320 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
17330 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
17340 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17350 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
17360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
17370 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
17380 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45           /* If E
17390 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
173a0 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22  OR is defined, "
173b0 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73  %00" in a URI is
173c0 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
173d0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
173e0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
173f0 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20  ntf("unexpected 
17400 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20  %%00 in uri");. 
17410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17420 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
17430 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
17440 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66  _uri_out;.#endif
17450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17460 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
17470 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
17480 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
17490 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
174a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
174b0 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
174c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
174d0 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
174e0 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
174f0 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
17500 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
17510 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
17520 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
17530 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
17540 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
17550 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
17560 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
17570 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
17580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
17590 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
175a0 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
175b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
175c0 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
175d0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
175e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
175f0 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
17600 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
17610 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
17620 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
17630 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
17640 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
17650 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
17660 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
17670 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
17680 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
17690 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
176a0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
176b0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
176c0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
176d0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
176e0 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
176f0 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
17700 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
17710 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
17720 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
17730 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
17740 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
17750 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
17760 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
17770 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
17780 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
17790 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
177a0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
177b0 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
177c0 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
177d0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
177e0 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
177f0 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
17800 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
17810 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17820 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
17830 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
17840 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
17850 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
17860 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
17870 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
17880 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
17890 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
178a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
178b0 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
178c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
178d0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
178e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
178f0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
17900 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
17910 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
17920 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
17930 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
17940 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
17950 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
17960 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
17970 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
17980 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
17990 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
179a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
179b0 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
179c0 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
179d0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
179e0 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
179f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
17a00 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
17a10 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
17a20 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
17a30 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
17a40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
17a50 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
17a60 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
17a70 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
17a80 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
17a90 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
17aa0 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
17ab0 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
17ac0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17ad0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
17ae0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
17af0 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
17b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17b10 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
17b20 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
17b30 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
17b40 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
17b50 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
17b60 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
17b70 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
17b80 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
17b90 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
17ba0 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
17bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17bc0 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
17bd0 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
17be0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17bf0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17c00 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
17c10 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
17c20 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
17c30 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
17c40 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
17c50 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
17c60 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
17c70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
17c80 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
17c90 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17cc0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17cd0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
17ce0 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
17cf0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17d00 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
17d10 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
17d20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
17d30 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
17d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
17d50 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
17d60 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
17d70 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
17d80 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
17d90 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
17da0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
17db0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
17dc0 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
17dd0 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
17de0 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
17df0 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
17e00 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
17e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17e20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
17e30 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
17e40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17e50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17e70 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
17e80 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17e90 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17ea0 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17eb0 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
17ec0 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
17ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17ee0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
17f00 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
17f10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17f20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
17f30 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
17f40 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
17f50 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17f60 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17f70 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
17f80 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
17f90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
17fc0 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
17fd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17fe0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
17ff0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
18000 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
18010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18020 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
18030 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
18040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18050 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
18060 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
18070 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
18080 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
18090 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
180a0 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
180b0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
180c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
180d0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b  .    if( nUri ){
180e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  .      memcpy(zF
180f0 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
18100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
18110 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
18120 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
18130 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
18140 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
18150 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
18160 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
18170 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
18180 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
18190 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
181a0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
181b0 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
181c0 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
181d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
181e0 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
181f0 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
18200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18220 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
18230 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
18240 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
18250 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
18260 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18270 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
18280 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a  LITE_HAS_CODEC).
18290 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 55 52  /*.** Process UR
182a0 49 20 66 69 6c 65 6e 61 6d 65 20 71 75 65 72 79  I filename query
182b0 20 70 61 72 61 6d 65 74 65 72 73 20 72 65 6c 65   parameters rele
182c0 76 61 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 69  vant to the SQLi
182d0 74 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a 2a 2a  te Encryption.**
182e0 20 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52 65 74   Extension.  Ret
182f0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
18300 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
18310 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
18320 20 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61 6e 64   are.** seen and
18330 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   return false if
18340 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   not..*/.int sql
18350 69 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61  ite3CodecQueryPa
18360 72 61 6d 65 74 65 72 73 28 0a 20 20 73 71 6c 69  rameters(.  sqli
18370 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
18380 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
18390 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
183a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
183b0 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
183c0 63 68 65 6d 61 20 69 73 20 62 65 69 6e 67 20 63  chema is being c
183d0 72 65 61 74 65 64 2f 61 74 74 61 63 68 65 64 20  reated/attached 
183e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
183f0 2a 7a 55 72 69 20 20 20 20 20 20 20 2f 2a 20 55  *zUri       /* U
18400 52 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29  RI filename */.)
18410 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
18420 7a 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a 4b 65  zKey;.  if( (zKe
18430 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
18440 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20  parameter(zUri, 
18450 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26 26  "hexkey"))!=0 &&
18460 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20   zKey[0] ){.    
18470 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 69 6e  u8 iByte;.    in
18480 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44  t i;.    char zD
18490 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20  ecoded[40];.    
184a0 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30  for(i=0, iByte=0
184b0 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f  ; i<sizeof(zDeco
184c0 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65  ded)*2 && sqlite
184d0 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69  3Isxdigit(zKey[i
184e0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
184f0 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
18500 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
18510 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20  oInt(zKey[i]);. 
18520 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d       if( (i&1)!=
18530 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32  0 ) zDecoded[i/2
18540 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 7d  ] = iByte;.    }
18550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  .    sqlite3_key
18560 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 44 65  _v2(db, zDb, zDe
18570 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20  coded, i/2);.   
18580 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
18590 73 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73  se if( (zKey = s
185a0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
185b0 65 74 65 72 28 7a 55 72 69 2c 20 22 6b 65 79 22  eter(zUri, "key"
185c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
185d0 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
185e0 7a 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74  zDb, zKey, sqlit
185f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29  e3Strlen30(zKey)
18600 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
18610 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b  .  }else if( (zK
18620 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ey = sqlite3_uri
18630 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c  _parameter(zUri,
18640 20 22 74 65 78 74 6b 65 79 22 29 29 21 3d 30 20   "textkey"))!=0 
18650 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
18660 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
18670 4b 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  Key, -1);.    re
18680 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
18690 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
186a0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
186b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
186c0 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
186d0 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
186e0 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
186f0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
18700 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
18710 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
18720 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
18730 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
18740 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
18750 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18760 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
18770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
18780 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
18790 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
187a0 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
187b0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
187c0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
187d0 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
187e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
187f0 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
18800 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
18810 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
18820 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
18830 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18840 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
18850 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
18860 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
18870 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
18880 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
18890 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
188a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
188b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
188c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
188d0 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
188f0 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
18900 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
18910 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
18920 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
18930 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
18940 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
18950 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
18960 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
18970 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
18980 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
18990 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
189a0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
189b0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
189c0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
189d0 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
189e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
189f0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
18a00 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
18a10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18a20 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
18a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
18a40 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
18a50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18a60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
18a70 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18a80 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
18a90 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
18aa0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
18ab0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
18ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
18ad0 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
18ae0 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
18af0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
18b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
18b10 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
18b20 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
18b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
18b40 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
18b50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
18b60 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a  FullMutex;.  }..
18b70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
18b80 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
18b90 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
18ba0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
18bb0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
18bc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
18bd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18be0 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
18bf0 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
18c00 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
18c10 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
18c20 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
18c30 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
18c40 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
18c50 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
18c60 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
18c70 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
18c80 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
18c90 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
18ca0 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
18cb0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
18cc0 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
18cd0 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
18ce0 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
18cf0 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
18d00 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
18d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18d20 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
18d30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18d40 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  E, SQLITE_OPEN_C
18d50 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  REATE, SQLITE_OP
18d60 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a  EN_SHAREDCACHE,.
18d70 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
18d80 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61  _PRIVATECACHE, a
18d90 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64  nd some reserved
18da0 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79   bits.  Silently
18db0 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61   mask.  ** off a
18dc0 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a  ll other flags..
18dd0 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20    */.  flags &= 
18de0 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
18df0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
18e20 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
18e30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18e40 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
18e50 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18e60 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
18e70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18e80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
18e90 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18eb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18ec0 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
18ed0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18ee0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
18ef0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
18f00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
18f10 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
18f20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18f30 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
18f40 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20  URNAL |.        
18f50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18f60 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20  EN_NOMUTEX |.   
18f70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18f80 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18f90 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
18fa0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
18fb0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
18fc0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18fd0 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
18fe0 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
18ff0 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
19000 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
19010 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
19020 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
19030 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
19040 20 69 73 54 68 72 65 61 64 73 61 66 65 20 0a 23   isThreadsafe .#
19050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19060 42 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45  BLE_MULTITHREADE
19070 44 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73  D_CHECKS.   || s
19080 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19090 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65  ig.bCoreMutex.#e
190a0 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62  ndif.  ){.    db
190b0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
190c0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
190d0 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
190e0 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
190f0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
19100 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19110 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
19120 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
19130 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
19140 20 20 20 20 69 66 28 20 69 73 54 68 72 65 61 64      if( isThread
19150 73 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  safe==0 ){.     
19160 20 73 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72   sqlite3MutexWar
19170 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62  nOnContention(db
19180 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
19190 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
191a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
191b0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
191c0 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
191d0 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
191e0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
191f0 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
19200 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
19210 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c 6f 6f  tatic;.  db->loo
19220 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
19230 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
19240 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
19250 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
19260 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
19270 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
19280 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
19290 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
192a0 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
192b0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
192c0 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49  _THREADS] = SQLI
192d0 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45  TE_DEFAULT_WORKE
192e0 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d  R_THREADS;.  db-
192f0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
19300 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
19310 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
19320 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
19330 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
19340 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
19350 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
19360 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
19370 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
19380 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
19390 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
193a0 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
193b0 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
193c0 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
193d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
193e0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
193f0 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
19400 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
19410 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
19430 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
19440 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
19450 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46  TE_DEFAULT_CKPTF
19460 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20  ULLFSYNC.       
19470 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19480 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
19490 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
194a0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
194b0 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
194c0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
194d0 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
194e0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
194f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
19500 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
19520 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
19530 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
19540 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
19550 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
19560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19570 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
19580 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
19590 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
195a0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
195b0 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
195c0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
195d0 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
195e0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
195f0 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
19600 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
19610 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e  QLITE_REVERSE_UN
19620 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29  ORDERED_SELECTS)
19630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19640 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72    | SQLITE_Rever
19650 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23  seOrder.#endif.#
19660 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19670 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
19680 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
196a0 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
196b0 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  Ck.#endif.#if de
196c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
196d0 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
196e0 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER).            
196f0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74       | SQLITE_Ft
19700 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64  s3Tokenizer.#end
19710 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
19720 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53  QLITE_ENABLE_QPS
19730 47 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  G).             
19740 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61      | SQLITE_Ena
19750 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66 0a 23  bleQPSG.#endif.#
19760 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19770 45 5f 44 45 46 41 55 4c 54 5f 44 45 46 45 4e 53  E_DEFAULT_DEFENS
19780 49 56 45 29 0a 20 20 20 20 20 20 20 20 20 20 20  IVE).           
19790 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 44        | SQLITE_D
197a0 65 66 65 6e 73 69 76 65 0a 23 65 6e 64 69 66 0a  efensive.#endif.
197b0 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
197c0 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
197d0 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
197e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
197f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
19800 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
19810 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
19820 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
19830 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
19840 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
19850 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
19860 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
19870 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
19880 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
19890 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
198a0 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
198b0 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
198c0 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
198d0 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
198e0 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
198f0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
19900 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e    **.  ** EVIDEN
19910 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34  CE-OF: R-52786-4
19920 34 38 37 38 20 53 51 4c 69 74 65 20 64 65 66 69  4878 SQLite defi
19930 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d  nes three built-
19940 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a  in collating.  *
19950 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a  * functions:.  *
19960 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
19970 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
19980 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
19990 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
199a0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
199b0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
199c0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
199d0 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  Y, SQLITE_UTF16B
199e0 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
199f0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
19a00 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
19a10 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
19a20 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
19a30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
19a40 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
19a50 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45  tion(db, "NOCASE
19a60 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
19a70 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  0, nocaseCollati
19a80 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  ngFunc, 0);.  cr
19a90 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19aa0 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
19ab0 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31  E_UTF8, (void*)1
19ac0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
19ad0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
19ae0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19af0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19b00 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45  ;.  }.  /* EVIDE
19b10 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d  NCE-OF: R-08308-
19b20 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c  17224 The defaul
19b30 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
19b40 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a  tion for all.  *
19b50 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e  * strings is BIN
19b60 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ARY. .  */.  db-
19b70 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
19b80 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
19b90 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
19ba0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
19bb0 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  Y, 0);.  assert(
19bc0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d   db->pDfltColl!=
19bd0 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  0 );..  /* Parse
19be0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52   the filename/UR
19bf0 49 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a  I argument.  **.
19c00 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    ** Only allow 
19c10 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
19c20 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
19c30 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
19c40 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
19c50 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
19c60 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
19c70 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
19c80 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
19c90 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
19ca0 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
19cb0 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
19cc0 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
19cd0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
19ce0 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
19cf0 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
19d00 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
19d10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
19d20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19d30 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
19d40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19d50 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
19d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19d70 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
19d80 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
19d90 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20    db->openFlags 
19da0 3d 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72  = flags;.  asser
19db0 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
19dc0 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31  EADONLY  == 0x01
19dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
19de0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19df0 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20  ITE == 0x02 );. 
19e00 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
19e10 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d  OPEN_CREATE    =
19e20 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74  = 0x04 );.  test
19e30 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
19e40 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a  &7))==0x02 ); /*
19e50 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74   READONLY */.  t
19e60 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
19e70 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b  ags&7))==0x04 );
19e80 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f   /* READWRITE */
19e90 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
19ea0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34  <(flags&7))==0x4
19eb0 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  0 ); /* READWRIT
19ec0 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20  E | CREATE */.  
19ed0 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26  if( ((1<<(flags&
19ee0 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29  7)) & 0x46)==0 )
19ef0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19f00 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20  E_MISUSE_BKPT;  
19f10 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d  /* IMP: R-65497-
19f20 34 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c 73 65  44594 */.  }else
19f30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19f40 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
19f50 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
19f60 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
19f70 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
19f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19fb0 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f  NOMEM ) sqlite3O
19fc0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
19fd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
19fe0 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72  hMsg(db, rc, zEr
19ff0 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
1a000 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
1a010 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
1a020 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Msg);.    goto o
1a030 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
1a040 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
1a050 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
1a060 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20  river */.  rc = 
1a070 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
1a080 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e  (db->pVfs, zOpen
1a090 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30  , db, &db->aDb[0
1a0a0 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20  ].pBt, 0,.      
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
1a0d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
1a0e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a0f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
1a100 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1a110 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
1a120 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a130 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1a140 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
1a150 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , rc);.    goto 
1a160 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
1a170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a180 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ter(db->aDb[0].p
1a190 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  Bt);.  db->aDb[0
1a1a0 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
1a1b0 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
1a1c0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
1a1d0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
1a1e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28  locFailed ) ENC(
1a1f0 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43  db) = SCHEMA_ENC
1a200 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
1a210 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44  treeLeave(db->aD
1a220 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
1a230 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
1a240 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
1a250 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a  et(db, 0);..  /*
1a260 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
1a270 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
1a280 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1a290 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65  is FULL; for the
1a2a0 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
1a2b0 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e 20 54  ase it is OFF. T
1a2c0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
1a2d0 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
1a2e0 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
1a2f0 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61  b->aDb[0].zDbSNa
1a300 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
1a310 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
1a320 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
1a330 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
1a340 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62  OUS+1;.  db->aDb
1a350 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22  [1].zDbSName = "
1a360 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62  temp";.  db->aDb
1a370 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [1].safety_level
1a380 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   = PAGER_SYNCHRO
1a390 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d  NOUS_OFF;..  db-
1a3a0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1a3b0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
1a3c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a3d0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
1a3e0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
1a3f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
1a400 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
1a410 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
1a420 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
1a430 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1a440 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
1a450 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
1a460 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
1a470 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
1a480 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
1a490 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1a4a0 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
1a4b0 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_OK);.  sqlite3
1a4c0 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65  RegisterPerConne
1a4d0 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63  ctionBuiltinFunc
1a4e0 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20  tions(db);.  rc 
1a4f0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1a500 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66 20 53  e(db);..#ifdef S
1a510 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1a520 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  5.  /* Register 
1a530 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46 54 53  any built-in FTS
1a540 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65 20  5 module before 
1a550 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75 74 6f  loading the auto
1a560 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e  matic.  ** exten
1a570 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f  sions. This allo
1a580 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ws automatic ext
1a590 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67 69 73  ensions to regis
1a5a0 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a 20 74  ter FTS5 .  ** t
1a5b0 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75  okenizers and au
1a5c0 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
1a5d0 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  s.  */.  if( !db
1a5e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a5f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1a600 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a610 74 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b  te3Fts5Init(db);
1a620 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a630 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
1a640 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
1a650 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
1a660 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
1a670 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
1a680 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
1a690 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
1a6a0 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  API..  */.  if( 
1a6b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
1a6d0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
1a6e0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
1a6f0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
1a700 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a720 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
1a730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1a740 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a750 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
1a760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a770 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1a780 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
1a790 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
1a7a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
1a7b0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a7c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1a7d0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
1a7e0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a7f0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a810 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1a820 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
1a830 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
1a840 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
1a850 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a860 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a870 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74  ABLE_FTS3 /* aut
1a880 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e  omatically defin
1a890 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41  ed by SQLITE_ENA
1a8a0 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66  BLE_FTS4 */.  if
1a8b0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a8c0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1a8e0 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
1a8f0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a900 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1a910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 29  LITE_ENABLE_ICU)
1a920 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1a930 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f 43 4f  TE_ENABLE_ICU_CO
1a940 4c 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66 28 20  LLATIONS).  if( 
1a950 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a960 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a970 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1a980 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
1a990 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a9a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a9b0 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
1a9c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a9d0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a9e0 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
1a9f0 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
1aa00 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1aa10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1aa20 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
1aa30 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1aa40 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1aa50 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
1aa60 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 70 61  rc = sqlite3Dbpa
1aa70 67 65 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  geRegister(db);.
1aa80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1aa90 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1aaa0 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69  _DBSTAT_VTAB.  i
1aab0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1aac0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1aad0 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1aae0 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65   sqlite3DbstatRe
1aaf0 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a  gister(db);.  }.
1ab00 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ab10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f  QLITE_ENABLE_JSO
1ab20 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  N1.  if( !db->ma
1ab30 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1ab40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1ab50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73    rc = sqlite3Js
1ab60 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  on1Init(db);.  }
1ab70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ab80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1ab90 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  MTVTAB.  if( !db
1aba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1abb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1abc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1abd0 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 64  e3StmtVtabInit(d
1abe0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1abf0 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
1ac00 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1ac10 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
1ac20 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
1ac30 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
1ac40 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
1ac50 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1ac60 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
1ac70 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
1ac80 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
1ac90 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
1aca0 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
1acb0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
1acc0 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
1acd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1ace0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
1acf0 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
1ad00 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1ad10 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
1ad20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
1ad30 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
1ad40 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
1ad50 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
1ad80 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1ad90 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
1ada0 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
1adb0 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
1adc0 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
1add0 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
1ade0 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
1adf0 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
1ae00 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
1ae10 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
1ae20 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1ae40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae50 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
1ae60 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
1ae70 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
1ae80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
1ae90 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
1aea0 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
1aeb0 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
1aec0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
1aed0 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
1aee0 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
1aef0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
1af00 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
1af10 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
1af20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1af30 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1af40 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1af50 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
1af60 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1af70 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
1af80 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
1af90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1afa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
1afb0 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
1afc0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1afd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1afe0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1aff0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
1b000 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
1b010 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
1b020 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
1b030 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
1b040 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
1b050 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
1b060 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
1b070 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
1b080 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
1b090 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
1b0a0 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
1b0b0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
1b0c0 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
1b0d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
1b0e0 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
1b0f0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
1b100 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
1b110 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
1b120 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d  CODEC).  if( rc=
1b130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c  =SQLITE_OK ) sql
1b140 69 74 65 33 43 6f 64 65 63 51 75 65 72 79 50 61  ite3CodecQueryPa
1b150 72 61 6d 65 74 65 72 73 28 64 62 2c 20 30 2c 20  rameters(db, 0, 
1b160 7a 4f 70 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20  zOpen);.#endif. 
1b170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
1b180 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pen);.  return r
1b190 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a  c & 0xff;.}.../*
1b1a0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
1b1b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
1b1c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
1b1d0 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
1b1e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
1b1f0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
1b200 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
1b210 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
1b220 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b250 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1b260 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1b270 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
1b280 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
1b290 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
1b2a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1b2b0 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
1b2c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
1b2d0 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
1b2e0 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
1b2f0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
1b300 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1b310 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
1b320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
1b330 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b340 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
1b350 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
1b360 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
1b370 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
1b380 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
1b390 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
1b3a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b3b0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1b3c0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1b3d0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1b3e0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
1b3f0 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
1b400 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
1b410 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
1b420 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1b430 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
1b440 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
1b450 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
1b460 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
1b470 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1b480 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
1b490 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b4a0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1b4b0 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
1b4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b4d0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b4e0 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
1b4f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b500 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
1b510 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
1b520 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
1b530 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b540 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69  #endif.  if( zFi
1b550 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c  lename==0 ) zFil
1b560 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30  ename = "\000\00
1b570 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  0";.  pVal = sql
1b580 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
1b590 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
1b5a0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
1b5b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
1b5c0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
1b5d0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1b5e0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
1b5f0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
1b600 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
1b610 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1b620 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
1b630 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
1b640 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b670 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1b680 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1b690 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1b6a0 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
1b6b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
1b6c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b6d0 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
1b6e0 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
1b6f0 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1b700 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41   ){.      SCHEMA
1b710 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e  _ENC(*ppDb) = EN
1b720 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
1b730 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
1b740 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b760 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
1b770 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
1b780 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
1b790 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23  n rc & 0xff;.}.#
1b7a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b7b0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
1b7c0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1b7d0 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
1b7e0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
1b7f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1b800 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
1b810 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1b820 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
1b830 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
1b840 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
1b850 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1b860 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1b870 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1b880 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1b890 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1b8a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1b8b0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1b8c0 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
1b8d0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
1b8e0 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
1b8f0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1b900 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b910 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1b920 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1b930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b940 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1b950 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
1b960 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
1b970 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
1b980 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1b990 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1b9a0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1b9b0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1b9c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
1b9d0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
1b9e0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
1b9f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1ba00 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1ba10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1ba20 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1ba30 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
1ba40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1ba50 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1ba60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ba70 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1ba80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
1ba90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1baa0 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
1bab0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
1bac0 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
1bad0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
1bae0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1baf0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1bb00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1bb10 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1bb20 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1bb30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1bb40 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1bb50 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1bb60 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1bb70 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1bb80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1bb90 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1bba0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1bbb0 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
1bbc0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
1bbd0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
1bbe0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1bbf0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1bc00 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1bc10 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1bc20 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1bc30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bc40 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
1bc50 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
1bc60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1bc70 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1bc80 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1bc90 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
1bca0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1bcb0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1bcc0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1bcd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1bce0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1bcf0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1bd00 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
1bd10 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
1bd20 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
1bd30 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
1bd40 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
1bd50 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
1bd60 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
1bd70 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
1bd80 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
1bd90 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
1bda0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1bdb0 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
1bdc0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1bdd0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1bde0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1bdf0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1be00 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1be10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1be20 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1be30 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
1be40 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1be50 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
1be60 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1be70 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
1be80 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
1be90 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
1bea0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1beb0 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
1bec0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
1bed0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
1bee0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1bef0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
1bf00 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
1bf10 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
1bf20 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
1bf30 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
1bf40 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
1bf50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1bf60 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1bf70 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1bf80 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1bf90 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1bfa0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1bfb0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1bfc0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1bfd0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
1bfe0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
1bff0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1c000 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
1c010 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
1c020 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
1c030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1c040 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1c050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c060 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1c070 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1c080 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1c090 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
1c0a0 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
1c0b0 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
1c0c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
1c0d0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
1c0e0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
1c0f0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
1c100 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
1c110 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1c120 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
1c130 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
1c140 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
1c150 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
1c160 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
1c170 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
1c180 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
1c190 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
1c1a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1c1b0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1c1c0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1c1d0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1c1e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c1f0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1c200 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1c210 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1c220 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
1c230 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
1c240 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1c250 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
1c260 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
1c270 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1c280 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1c290 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c2a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1c2b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c2c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c2d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1c2e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c2f0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1c300 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c310 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
1c320 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
1c330 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
1c340 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
1c350 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
1c360 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
1c370 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
1c380 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
1c390 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
1c3a0 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
1c3b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
1c3c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
1c3d0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
1c3e0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1c3f0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
1c400 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
1c410 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
1c420 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
1c430 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
1c440 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
1c450 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
1c460 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
1c470 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
1c480 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
1c490 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
1c4a0 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
1c4b0 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
1c4c0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
1c4d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1c4e0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
1c4f0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
1c500 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c510 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1c520 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1c530 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
1c540 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
1c550 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
1c560 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
1c570 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
1c580 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
1c590 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1c5a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
1c5b0 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
1c5c0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
1c5d0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
1c5e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
1c5f0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
1c600 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20  QLITE_NOMEM and 
1c610 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
1c620 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
1c630 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
1c640 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
1c650 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
1c660 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
1c670 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
1c680 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
1c690 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
1c6a0 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
1c6b0 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
1c6c0 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
1c6d0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
1c6e0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
1c6f0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1c700 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
1c710 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
1c720 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
1c730 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
1c740 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
1c750 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1c760 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74  or(int iErr, int
1c770 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63   lineno, const c
1c780 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73  har *zType){.  s
1c790 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c  qlite3_log(iErr,
1c7a0 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20   "%s at line %d 
1c7b0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
1c7c0 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
1c7d0 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c  , lineno, 20+sql
1c7e0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
1c7f0 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b  ;.  return iErr;
1c800 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  .}.int sqlite3Co
1c810 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c  rruptError(int l
1c820 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1c830 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1c840 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1c850 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1c860 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1c870 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c  QLITE_CORRUPT, l
1c880 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65  ineno, "database
1c890 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d   corruption");.}
1c8a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
1c8b0 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
1c8c0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1c8d0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c8e0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1c8f0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c900 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1c910 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e  TE_MISUSE, linen
1c920 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a  o, "misuse");.}.
1c930 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
1c940 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
1c950 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1c960 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1c970 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1c980 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c990 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1c9a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69  ITE_CANTOPEN, li
1c9b0 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  neno, "cannot op
1c9c0 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66  en file");.}.#if
1c9d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c9e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1c9f0 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74  uptPgnoError(int
1ca00 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67   lineno, Pgno pg
1ca10 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  no){.  char zMsg
1ca20 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
1ca30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1ca40 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64  (zMsg), zMsg, "d
1ca50 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1ca60 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e  on page %d", pgn
1ca70 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o);.  testcase( 
1ca80 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ca90 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1caa0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1cab0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1cac0 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1cad0 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20  o, zMsg);.}.int 
1cae0 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f  sqlite3NomemErro
1caf0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1cb00 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1cb10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1cb20 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1cb30 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  rn sqlite3Report
1cb40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  Error(SQLITE_NOM
1cb50 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d  EM, lineno, "OOM
1cb60 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1cb70 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72  3IoerrnomemError
1cb80 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1cb90 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1cba0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1cbb0 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1cbc0 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1cbd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1cbe0 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c  R_NOMEM, lineno,
1cbf0 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22   "I/O OOM error"
1cc00 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
1cc10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cc20 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
1cc30 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76  * This is a conv
1cc40 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20  enience routine 
1cc50 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20  that makes sure 
1cc60 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d  that all thread-
1cc70 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61  specific.** data
1cc80 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64   for this thread
1cc90 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f   has been deallo
1cca0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  cated..**.** SQL
1ccb0 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73  ite no longer us
1ccc0 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  es thread-specif
1ccd0 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20  ic data so this 
1cce0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61  routine is now a
1ccf0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69  .** no-op.  It i
1cd00 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68  s retained for h
1cd10 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
1cd20 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  ibility..*/.void
1cd30 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1cd40 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d  cleanup(void){.}
1cd50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1cd60 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72  eturn meta infor
1cd70 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73  mation about a s
1cd80 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f  pecific column o
1cd90 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  f a database tab
1cda0 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  le..** See comme
1cdb0 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20  nt in sqlite3.h 
1cdc0 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f  (sqlite.h.in) fo
1cdd0 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
1cde0 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
1cdf0 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
1ce00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
1ce30 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
1ce40 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
1ce50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ce60 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
1ce70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ce80 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
1ce90 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
1cea0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1ceb0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
1cec0 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
1ced0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
1cee0 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
1cef0 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
1cf00 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
1cf10 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1cf20 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
1cf30 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
1cf40 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
1cf50 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
1cf60 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
1cf70 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1cf80 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
1cf90 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
1cfa0 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
1cfb0 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
1cfc0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1cfd0 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
1cfe0 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
1cff0 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
1d000 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1d010 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1d020 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
1d030 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1d040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d050 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
1d060 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
1d070 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
1d080 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
1d090 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72  iCol = 0;.  char
1d0a0 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
1d0b0 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
1d0c0 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
1d0d0 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
1d0e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
1d0f0 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
1d100 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 20  t autoinc = 0;. 
1d110 20 69 6e 74 20 62 55 6e 6c 6f 63 6b 3b 0a 0a 23   int bUnlock;..#
1d120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1d130 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1d140 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1d150 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1d160 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29   zTableName==0 )
1d170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d180 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1d190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1d1a0 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
1d1b0 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1d1c0 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
1d1d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d1e0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1d1f0 3b 0a 20 20 62 55 6e 6c 6f 63 6b 20 3d 20 73 71  ;.  bUnlock = sq
1d200 6c 69 74 65 33 4c 6f 63 6b 52 65 75 73 61 62 6c  lite3LockReusabl
1d210 65 53 63 68 65 6d 61 28 64 62 29 3b 0a 20 20 73  eSchema(db);.  s
1d220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d230 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20 49  All(db);.  if( I
1d240 73 53 68 61 72 65 64 53 63 68 65 6d 61 28 64 62  sSharedSchema(db
1d250 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
1d260 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
1d270 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a   &zErrMsg);.  }.
1d280 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
1d290 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
1d2a0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  on */.  if( rc==
1d2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
1d2c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d2d0 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 0a  E_SHARED_SCHEMA.
1d2e0 20 20 20 20 50 61 72 73 65 20 73 50 61 72 73 65      Parse sParse
1d2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d300 20 20 20 20 2f 2a 20 46 61 6b 65 20 50 61 72 73      /* Fake Pars
1d310 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 46 69 6e  e object for Fin
1d320 64 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61  dTable */.    Pa
1d330 72 73 65 20 2a 70 53 61 76 65 64 20 3d 20 64 62  rse *pSaved = db
1d340 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 6d 65  ->pParse;.    me
1d350 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c  mset(&sParse, 0,
1d360 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29   sizeof(sParse))
1d370 3b 0a 20 20 20 20 64 62 2d 3e 70 50 61 72 73 65  ;.    db->pParse
1d380 20 3d 20 26 73 50 61 72 73 65 3b 0a 23 65 6e 64   = &sParse;.#end
1d390 69 66 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  if.    pTab = sq
1d3a0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1d3b0 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
1d3c0 44 62 4e 61 6d 65 29 3b 0a 23 69 66 64 65 66 20  DbName);.#ifdef 
1d3d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 48  SQLITE_ENABLE_SH
1d3e0 41 52 45 44 5f 53 43 48 45 4d 41 0a 20 20 20 20  ARED_SCHEMA.    
1d3f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61  sqlite3_free(sPa
1d400 72 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  rse.zErrMsg);.  
1d410 20 20 72 63 20 3d 20 73 50 61 72 73 65 2e 72 63    rc = sParse.rc
1d420 3b 0a 20 20 20 20 64 62 2d 3e 70 50 61 72 73 65  ;.    db->pParse
1d430 20 3d 20 70 53 61 76 65 64 3b 0a 23 65 6e 64 69   = pSaved;.#endi
1d440 66 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  f.  }.  if( SQLI
1d450 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1d460 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 0a 20 20 69   error_out;..  i
1d470 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
1d480 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1d490 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
1d4a0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1d4b0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
1d4c0 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
1d4d0 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
1d4e0 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
1d4f0 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
1d500 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
1d510 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
1d520 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
1d530 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
1d540 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
1d550 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1d560 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
1d570 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
1d580 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1d590 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
1d5a0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
1d5b0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1d5c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1d5d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
1d5e0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
1d5f0 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
1d600 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
1d610 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
1d620 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1d630 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
1d640 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
1d650 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
1d660 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1d670 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
1d680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
1d690 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
1d6a0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1d6b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d6c0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1d6d0 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
1d6e0 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
1d6f0 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
1d700 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
1d710 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
1d720 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
1d730 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
1d740 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
1d750 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
1d760 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
1d770 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
1d780 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
1d790 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
1d7a0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
1d7b0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
1d7c0 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
1d7d0 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
1d7e0 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
1d7f0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1d800 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1d810 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
1d820 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
1d830 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
1d840 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
1d850 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
1d860 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
1d870 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
1d880 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
1d890 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
1d8a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1d8b0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
1d8c0 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
1d8d0 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69  zDataType = sqli
1d8e0 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
1d8f0 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ol,0);.    zColl
1d900 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
1d910 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
1d920 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
1d930 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
1d940 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46  y  = (pCol->colF
1d950 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
1d960 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20  RIMKEY)!=0;.    
1d970 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
1d980 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
1d990 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1d9a0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
1d9b0 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
1d9c0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1d9d0 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
1d9e0 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
1d9f0 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
1da00 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
1da10 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  eq = sqlite3StrB
1da20 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f  INARY;.  }..erro
1da30 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1da40 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1da50 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1da60 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1da70 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1da80 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1da90 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1daa0 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1dab0 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1dac0 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1dad0 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1dae0 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1daf0 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1db00 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1db10 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1db20 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1db30 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1db40 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1db50 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1db60 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1db70 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1db80 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1db90 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1dba0 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1dbb0 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1dbc0 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1dbd0 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1dbe0 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1dbf0 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1dc00 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1dc10 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1dc20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dc30 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1dc40 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1dc50 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1dc60 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1dc70 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1dc80 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1dc90 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1dca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dcb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1dcc0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1dcd0 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1dce0 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1dcf0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1dd00 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1dd10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1dd20 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1dd30 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 6f 63 6b  .  sqlite3Unlock
1dd40 52 65 75 73 61 62 6c 65 53 63 68 65 6d 61 28 64  ReusableSchema(d
1dd50 62 2c 20 62 55 6e 6c 6f 63 6b 29 3b 0a 20 20 73  b, bUnlock);.  s
1dd60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1dd70 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1dd80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dd90 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
1dda0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
1ddb0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
1ddc0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
1ddd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1dde0 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
1ddf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1de00 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
1de10 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1de20 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1de30 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
1de40 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
1de50 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1de60 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
1de70 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
1de80 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
1de90 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
1dea0 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
1deb0 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
1dec0 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
1ded0 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
1dee0 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
1def0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1df00 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
1df10 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
1df20 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
1df30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df40 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
1df50 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
1df60 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
1df70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1df80 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1df90 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1dfa0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1dfb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1dfc0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1dfd0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1dfe0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1dff0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
1e000 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
1e010 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
1e020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e030 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1e040 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1e060 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
1e070 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
1e080 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1e090 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
1e0a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1e0b0 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
1e0c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e0d0 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
1e0e0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
1e0f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1e100 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
1e110 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ree;..#ifdef SQL
1e120 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1e130 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1e140 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1e150 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1e160 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1e170 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1e180 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1e190 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
1e1a0 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
1e1b0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1e1c0 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
1e1d0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
1e1e0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1e1f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1e200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e210 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1e220 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
1e230 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1e240 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
1e250 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1e260 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
1e270 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
1e280 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1e290 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
1e2a0 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1e2b0 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
1e2c0 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1e2d0 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1e2e0 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
1e2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e300 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1e310 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f  ITE_FCNTL_VFS_PO
1e320 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1e330 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70  (sqlite3_vfs**)p
1e340 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1e350 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20  erVfs(pPager);. 
1e360 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e370 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1e380 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1e390 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e  NTL_JOURNAL_POIN
1e3a0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1e3b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1e3c0 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1e3d0 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72  rJrnlFile(pPager
1e3e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1e3f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1e400 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1e410 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52  E_FCNTL_DATA_VER
1e420 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2a 28  SION ){.      *(
1e430 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41  unsigned int*)pA
1e440 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1e450 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70 50 61  rDataVersion(pPa
1e460 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1e470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1e490 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1e4a0 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1e4b0 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
1e4c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1e4d0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1e4e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1e4f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1e500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e510 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1e520 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1e530 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1e540 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e550 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1e560 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1e570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  ifdef SQLITE_UNT
1e580 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53 45 44  ESTABLE.  UNUSED
1e590 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a  _PARAMETER(op);.
1e5a0 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20  #else.  va_list 
1e5b0 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1e5c0 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
1e5d0 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
1e5e0 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
1e5f0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1e600 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
1e610 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e620 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1e630 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
1e640 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
1e650 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1e660 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e670 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
1e680 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1e690 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
1e6a0 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
1e6b0 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
1e6c0 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
1e6d0 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
1e6e0 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
1e6f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1e700 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
1e710 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
1e720 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e730 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1e740 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
1e750 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
1e760 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
1e770 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e780 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1e790 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
1e7a0 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
1e7b0 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
1e7c0 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
1e7d0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
1e7e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
1e7f0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
1e800 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
1e810 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
1e820 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
1e830 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
1e840 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
1e850 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e860 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1e870 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
1e880 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1e890 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
1e8a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e8b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e8c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e8d0 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
1e8e0 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
1e8f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
1e900 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
1e910 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
1e920 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
1e930 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
1e940 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
1e950 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1e960 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
1e970 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
1e980 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
1e990 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
1e9a0 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
1e9b0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
1e9c0 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
1e9d0 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
1e9e0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1e9f0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
1ea00 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1ea10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ea20 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ea30 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
1ea40 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
1ea50 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1ea60 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
1ea70 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
1ea80 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
1ea90 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1eaa0 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
1eab0 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
1eac0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ead0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1eae0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
1eaf0 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
1eb00 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
1eb10 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
1eb20 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
1eb30 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
1eb40 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
1eb50 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
1eb60 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
1eb70 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1eb80 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
1eb90 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
1eba0 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
1ebb0 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
1ebc0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
1ebd0 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
1ebe0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1ebf0 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
1ec00 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
1ec10 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
1ec20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
1ec30 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1ec40 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
1ec50 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
1ec60 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ec70 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
1ec80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ec90 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
1eca0 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
1ecb0 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
1ecc0 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
1ecd0 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
1ece0 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
1ecf0 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
1ed00 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
1ed10 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
1ed20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ed30 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1ed40 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
1ed50 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
1ed60 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
1ed70 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
1ed80 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
1ed90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eda0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1edb0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1edc0 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
1edd0 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
1ede0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1edf0 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
1ee00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ee10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ee20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ee30 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
1ee40 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
1ee50 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
1ee60 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
1ee70 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
1ee80 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
1ee90 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
1eea0 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
1eeb0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
1eec0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1eed0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
1eee0 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
1eef0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1ef00 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
1ef10 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
1ef20 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1ef30 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
1ef40 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1ef50 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
1ef60 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
1ef70 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1ef80 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
1ef90 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
1efa0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1efb0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1efc0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
1efd0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
1efe0 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
1eff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f000 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1f010 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1f020 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f030 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1f040 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
1f050 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1f060 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
1f070 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
1f080 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
1f090 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
1f0a0 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
1f0b0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
1f0c0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1f0d0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
1f0e0 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
1f0f0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
1f100 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1f110 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
1f120 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
1f130 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
1f140 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
1f150 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
1f160 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
1f170 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1f180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1f190 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
1f1a0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1f1b0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
1f1c0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
1f1d0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
1f1e0 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
1f1f0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
1f200 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
1f210 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
1f220 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f230 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1f240 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
1f250 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
1f260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f270 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
1f280 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
1f290 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
1f2a0 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
1f2b0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
1f2c0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
1f2d0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
1f2e0 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
1f2f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1f300 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f310 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1f320 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f330 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1f340 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
1f350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1f360 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1f370 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1f380 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1f390 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
1f3a0 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
1f3b0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1f3c0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
1f3d0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
1f3e0 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
1f3f0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1f400 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
1f410 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1f420 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
1f430 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1f440 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1f450 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
1f460 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
1f470 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1f480 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
1f490 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
1f4a0 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
1f4b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
1f4c0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
1f4d0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1f4e0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1f4f0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1f500 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1f510 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1f520 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f530 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
1f540 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
1f550 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
1f560 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66  ssert( /*side-ef
1f570 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20  fects-ok*/ (x = 
1f580 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1f590 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1f5a0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1f5b0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1f5c0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1f5d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f5e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1f5f0 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1f600 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1f610 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1f620 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1f630 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1f640 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1f650 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1f660 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1f670 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1f680 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1f690 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1f6a0 41 59 53 28 58 29 20 69 66 20 58 20 69 73 20 74  AYS(X) if X is t
1f6b0 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58 20 69  rue, or 0 if X i
1f6c0 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a  s false..    **.
1f6d0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
1f6e0 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
1f6f0 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
1f700 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
1f710 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
1f720 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
1f730 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
1f740 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1f750 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
1f760 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
1f770 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
1f780 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1f790 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
1f7a0 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
1f7b0 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
1f7c0 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
1f7d0 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
1f7e0 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
1f7f0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1f800 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
1f810 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
1f820 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
1f830 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1f840 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1f850 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1f860 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1f870 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
1f880 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
1f890 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
1f8a0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1f8b0 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
1f8c0 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1f8d0 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1f8e0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1f8f0 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1f900 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
1f910 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f920 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
1f930 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
1f940 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
1f950 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1f960 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
1f970 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f980 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f990 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
1f9a0 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
1f9b0 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
1f9c0 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
1f9d0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1f9e0 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
1f9f0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1fa00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fa10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fa20 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
1fa30 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1fa40 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
1fa50 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
1fa60 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
1fa70 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
1fa80 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
1fa90 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1faa0 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
1fab0 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
1fac0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
1fad0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
1fae0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1faf0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1fb00 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
1fb10 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1fb20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
1fb30 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29 20 3a   x ? ALWAYS(x) :
1fb40 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1fb50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1fb60 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f     **   sqlite3_
1fb70 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1fb80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1fb90 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a  EORDER);.    **.
1fba0 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67      ** The integ
1fbb0 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65  er returned reve
1fbc0 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64  als the byte-ord
1fbd0 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74  er of the comput
1fbe0 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  er on which.    
1fbf0 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e  ** SQLite is run
1fc00 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ning:.    **.   
1fc10 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20   **       1     
1fc20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1fc30 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
1fc40 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20  -time.    **    
1fc50 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d    10     little-
1fc60 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1fc70 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1fc80 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20     **  432101   
1fc90 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1fca0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1fcb0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1fcc0 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c  **  123410     l
1fcd0 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1fce0 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1fcf0 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20  ile-time.    */ 
1fd00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fd10 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1fd20 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  DER: {.      rc 
1fd30 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  = SQLITE_BYTEORD
1fd40 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f  ER*100 + SQLITE_
1fd50 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20  LITTLEENDIAN*10 
1fd60 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  + SQLITE_BIGENDI
1fd70 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  AN;.      break;
1fd80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1fd90 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1fda0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1fdb0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
1fdc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1fdd0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1fde0 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
1fdf0 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
1fe00 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1fe10 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
1fe20 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
1fe30 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
1fe40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1fe50 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
1fe60 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1fe70 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1fe80 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1fe90 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1fea0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1feb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fec0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1fed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1fee0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
1fef0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1ff00 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
1ff10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ff20 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1ff30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ff40 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1ff50 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ff60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ff70 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
1ff80 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1ff90 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1ffa0 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1ffb0 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
1ffc0 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
1ffd0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
1ffe0 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
1fff0 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
20000 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
20010 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
20020 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
20030 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
20040 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
20050 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
20060 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
20070 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
20080 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
20090 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
200a0 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
200b0 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
200c0 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
200d0 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
200e0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
200f0 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
20100 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
20110 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
20120 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
20130 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
20140 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20150 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
20160 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
20170 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
20180 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
20190 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
201a0 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
201b0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
201c0 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
201d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
201e0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
201f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20200 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
20210 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20  TIME_FAULT, int 
20220 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20  onoff);.    **. 
20230 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74     ** If paramet
20240 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d  er onoff is non-
20250 7a 65 72 6f 2c 20 73 75 62 73 65 71 75 65 6e 74  zero, subsequent
20260 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
20270 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20 61 6e 64  ime().    ** and
20280 20 69 74 73 20 76 61 72 69 61 6e 74 73 20 66 61   its variants fa
20290 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
202a0 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68 69 73 20  zero, undo this 
202b0 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
202c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
202d0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
202e0 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
202f0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
20300 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
20310 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
20320 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
20330 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20340 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
20350 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20360 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54 45 52  E_TESTCTRL_INTER
20370 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e 74 20 6f  NAL_FUNCS, int o
20380 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  noff);.    **.  
20390 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65    ** If paramete
203a0 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a  r onoff is non-z
203b0 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c 2d 75 73  ero, internal-us
203c0 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75 6e 63 74  e-only SQL funct
203d0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ions.    ** are 
203e0 76 69 73 69 62 6c 65 20 74 6f 20 6f 72 64 69 6e  visible to ordin
203f0 61 72 79 20 53 51 4c 2e 20 20 54 68 69 73 20 69  ary SQL.  This i
20400 73 20 75 73 65 66 75 6c 20 66 6f 72 20 74 65 73  s useful for tes
20410 74 69 6e 67 20 62 75 74 20 69 73 0a 20 20 20 20  ting but is.    
20420 2a 2a 20 75 6e 73 61 66 65 20 62 65 63 61 75 73  ** unsafe becaus
20430 65 20 69 6e 76 61 6c 69 64 20 70 61 72 61 6d 65  e invalid parame
20440 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20 69 6e  ters to those in
20450 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20  ternal-use-only 
20460 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  functions.    **
20470 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 63   can result in c
20480 72 61 73 68 65 73 20 6f 72 20 73 65 67 66 61 75  rashes or segfau
20490 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lts..    */.    
204a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
204b0 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55  CTRL_INTERNAL_FU
204c0 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  NCTIONS: {.     
204d0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
204e0 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c 46 75  nfig.bInternalFu
204f0 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f 61 72 67  nctions = va_arg
20500 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
20510 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20520 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
20530 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20540 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
20550 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29  ER_CORRUPT, int)
20560 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20570 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66  Set or clear a f
20580 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74  lag that indicat
20590 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  es that the data
205a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77  base file is alw
205b0 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a  ays well-.    **
205c0 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65   formed and neve
205d0 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73  r corrupt.  This
205e0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62   flag is clear b
205f0 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63  y default, indic
20600 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  ating that.    *
20610 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  * database files
20620 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69   might have arbi
20630 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e  trary corruption
20640 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66  .  Setting the f
20650 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  lag during.    *
20660 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73  * testing causes
20670 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28   certain assert(
20680 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
20690 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61  the code to be a
206a0 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20  ctivated.    ** 
206b0 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20  that demonstrat 
206c0 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65  invariants on we
206d0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
206e0 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  se files..    */
206f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20700 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
20710 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20  CORRUPT: {.     
20720 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20730 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70  nfig.neverCorrup
20740 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
20750 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
20760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20770 53 65 74 20 74 68 65 20 74 68 72 65 73 68 6f 6c  Set the threshol
20780 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e  d at which OP_On
20790 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65 73 65  ce counters rese
207a0 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a  t back to zero..
207b0 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61 75 6c      ** By defaul
207c0 74 20 74 68 69 73 20 69 73 20 30 78 37 66 66 66  t this is 0x7fff
207d0 66 66 66 65 20 28 6f 76 65 72 20 32 20 62 69 6c  fffe (over 2 bil
207e0 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61 74 20  lion), but that 
207f0 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a 20  value is.    ** 
20800 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73 74 20  too big to test 
20810 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  in a reasonable 
20820 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20  amount of time, 
20830 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20  so this control 
20840 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69 64  is.    ** provid
20850 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d 61 6c  ed to set a smal
20860 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72 65 61  l and easily rea
20870 63 68 61 62 6c 65 20 72 65 73 65 74 20 76 61 6c  chable reset val
20880 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
20890 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
208a0 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54  TRL_ONCE_RESET_T
208b0 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20  HRESHOLD: {.    
208c0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
208d0 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73 65 74  onfig.iOnceReset
208e0 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61  Threshold = va_a
208f0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
20900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20910 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20920 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20930 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
20940 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43  DBE_COVERAGE, xC
20950 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20  allback, ptr);. 
20960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
20970 20 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61   the VDBE covera
20980 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  ge callback func
20990 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63  tion to xCallbac
209a0 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a  k with context .
209b0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70      ** pointer p
209c0 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  tr..    */.    c
209d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
209e0 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
209f0 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  E: {.#ifdef SQLI
20a00 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
20a10 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
20a20 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c  oid (*branch_cal
20a30 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75 6e 73  lback)(void*,uns
20a40 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20 20 20  igned int,.     
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2c 75   unsigned char,u
20a80 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b 0a 20  nsigned char);. 
20a90 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
20aa0 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72  alConfig.xVdbeBr
20ab0 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  anch = va_arg(ap
20ac0 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  ,branch_callback
20ad0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20ae0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64  GlobalConfig.pVd
20af0 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61  beBranchArg = va
20b00 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a  _arg(ap,void*);.
20b10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
20b20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20b30 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
20b40 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20b50 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
20b60 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b  MMAP, db, nMax);
20b70 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20b80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
20b90 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
20ba0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20bb0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
20bc0 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
20bd0 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
20be0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
20bf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20c00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
20c10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
20c20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
20c30 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20  TRL_ISINIT);.   
20c40 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72   **.    ** Retur
20c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53  n SQLITE_OK if S
20c60 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69  QLite has been i
20c70 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53  nitialized and S
20c80 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20  QLITE_ERROR if. 
20c90 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a     ** not..    *
20ca0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20cb0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
20cc0 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  T: {.      if( s
20cd0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
20ce0 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72  ig.isInit==0 ) r
20cf0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20d00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20d10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
20d20 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20d30 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20d40 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c  RL_IMPOSTER, db,
20d50 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20   dbName, onOff, 
20d60 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  tnum);.    **.  
20d70 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63    ** This test c
20d80 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74  ontrol is used t
20d90 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65  o create imposte
20da0 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20  r tables.  "db" 
20db0 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20  is a pointer.   
20dc0 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
20dd0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
20de0 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64   dbName is the d
20df0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78  atabase name (ex
20e00 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20  : "main" or.    
20e10 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68  ** "temp") which
20e20 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68   will receive th
20e30 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e  e imposter.  "on
20e40 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73  Off" turns impos
20e50 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20  ter mode on.    
20e60 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75  ** or off.  "tnu
20e70 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  m" is the root p
20e80 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
20e90 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
20ea0 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  mposter.    ** t
20eb0 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e  able should conn
20ec0 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ect..    **.    
20ed0 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74  ** Enable impost
20ee0 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65  er mode only whe
20ef0 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  n the schema has
20f00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
20f10 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20  rsed.  Then.    
20f20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20  ** run a single 
20f30 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
20f40 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72  tement to constr
20f50 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72  uct the imposter
20f60 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a   table in.    **
20f70 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65   the parsed sche
20f80 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69  ma.  Then turn i
20f90 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63  mposter mode bac
20fa0 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20  k off again..   
20fb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e   **.    ** If on
20fc0 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e  Off==0 and tnum>
20fd0 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
20fe0 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20   schema for all 
20ff0 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69  databases, causi
21000 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  ng.    ** the sc
21010 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72  hema to be repar
21020 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  sed the next tim
21030 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20  e it is needed. 
21040 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20   This has the.  
21050 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65    ** effect of e
21060 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73  rasing all impos
21070 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ter tables..    
21080 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
21090 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
210a0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
210b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
210c0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
210d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
210e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
210f0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62  mutex);.      db
21100 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c  ->init.iDb = sql
21110 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
21120 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e  b, va_arg(ap,con
21130 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
21140 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
21150 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  = db->init.impos
21160 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72  terTable = va_ar
21170 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
21180 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
21190 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  m = va_arg(ap,in
211a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  t);.      if( db
211b0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26  ->init.busy==0 &
211c0 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  & db->init.newTn
211d0 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  um>0 ){.        
211e0 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
211f0 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
21200 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  on(db);.      }.
21210 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
21220 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
21230 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
21240 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  k;.    }..#if de
21250 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45  fined(YYCOVERAGE
21260 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ).    /*  sqlite
21270 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
21280 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
21290 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20  ARSER_COVERAGE, 
212a0 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20 20 2a  FILE *out).    *
212b0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
212c0 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c 79  st control (only
212d0 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20   available when 
212e0 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
212f0 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 2d  ed with.    ** -
21300 44 59 59 43 4f 56 45 52 41 47 45 29 20 77 72 69  DYYCOVERAGE) wri
21310 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f 6e 74  tes a report ont
21320 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73 68 6f  o "out" that sho
21330 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74  ws all.    ** st
21340 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f  ate/lookahead co
21350 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20 74 68  mbinations in th
21360 65 20 70 61 72 73 65 72 20 73 74 61 74 65 20 6d  e parser state m
21370 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20 77 68  achine.    ** wh
21380 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 65 78  ich are never ex
21390 65 72 63 69 73 65 64 2e 20 20 49 66 20 61 6e 79  ercised.  If any
213a0 20 73 74 61 74 65 20 69 73 20 6d 69 73 73 65 64   state is missed
213b0 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a  , make the.    *
213c0 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51  * return code SQ
213d0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 20 20  LITE_ERROR..    
213e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
213f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53  TE_TESTCTRL_PARS
21400 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 20  ER_COVERAGE: {. 
21410 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d       FILE *out =
21420 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49 4c 45   va_arg(ap, FILE
21430 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  *);.      if( sq
21440 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76 65 72  lite3ParserCover
21450 61 67 65 28 6f 75 74 29 20 29 20 72 63 20 3d 20  age(out) ) rc = 
21460 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
21470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21480 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
21490 65 64 28 59 59 43 4f 56 45 52 41 47 45 29 20 2a  ed(YYCOVERAGE) *
214a0 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  /.  }.  va_end(a
214b0 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
214c0 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 20  LITE_UNTESTABLE 
214d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
214e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
214f0 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
21500 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
21510 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
21520 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
21530 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
21540 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
21550 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
21560 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
21570 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
21580 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
21590 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
215a0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
215b0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
215c0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
215d0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
215e0 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
215f0 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
21600 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
21610 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
21620 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
21630 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
21640 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
21650 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
21660 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
21670 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
21680 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
21690 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
216a0 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
216b0 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
216c0 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
216d0 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
216e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
216f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
21700 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
21710 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
21720 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
21730 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
21740 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
21750 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
21760 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30  ==0 || zParam==0
21770 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
21780 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
21790 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
217a0 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
217b0 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
217c0 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
217d0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
217e0 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
217f0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
21800 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
21810 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
21820 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
21830 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
21840 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
21850 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
21860 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
21870 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21880 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
21890 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
218a0 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
218b0 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
218c0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
218d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
218e0 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
218f0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
21900 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
21910 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
21920 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
21930 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
21940 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
21950 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
21960 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
21970 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
21980 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
21990 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
219a0 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
219b0 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
219c0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
219d0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
219e0 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
219f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
21a00 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
21a10 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
21a20 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
21a30 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
21a40 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
21a50 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
21a60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
21a70 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
21a80 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
21a90 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
21aa0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
21ab0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
21ac0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
21ad0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
21ae0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
21af0 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
21b00 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
21b10 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20 29 7b  I64(z, &v)==0 ){
21b20 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a  .    bDflt = v;.
21b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66    }.  return bDf
21b40 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  lt;.}../*.** Ret
21b50 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f  urn the Btree po
21b60 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64  inter identified
21b70 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65   by zDbName.  Re
21b80 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
21b90 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65   found..*/.Btree
21ba0 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54   *sqlite3DbNameT
21bb0 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a  oBtree(sqlite3 *
21bc0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
21bd0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  zDbName){.  int 
21be0 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f 20  iDb = zDbName ? 
21bf0 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
21c00 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20 3a  e(db, zDbName) :
21c10 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 44 62   0;.  return iDb
21c20 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44 62  <0 ? 0 : db->aDb
21c30 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a  [iDb].pBt;.}../*
21c40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
21c50 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  ilename of the d
21c60 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
21c70 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
21c80 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
21c90 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21ca0 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65  *sqlite3_db_file
21cb0 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  name(sqlite3 *db
21cc0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
21cd0 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20  bName){.  Btree 
21ce0 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  *pBt;.#ifdef SQL
21cf0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
21d00 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
21d10 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
21d20 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
21d30 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
21d40 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
21d50 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
21d60 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
21d70 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
21d80 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
21d90 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
21da0 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
21db0 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  (pBt) : 0;.}../*
21dc0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
21dd0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64  database is read
21de0 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65  -only or 0 if re
21df0 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72  ad/write.  Retur
21e00 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  n -1 if.** no su
21e10 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73  ch database exis
21e20 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
21e30 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73  e3_db_readonly(s
21e40 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21e50 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
21e60 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
21e70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21e80 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
21e90 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
21ea0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
21eb0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
21ec0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
21ed0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
21ee0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20   }.#endif.  pBt 
21ef0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
21f00 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
21f10 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
21f20 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
21f30 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20  IsReadonly(pBt) 
21f40 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  : -1;.}..#ifdef 
21f50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
21f60 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74  APSHOT./*.** Obt
21f70 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68  ain a snapshot h
21f80 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e  andle for the sn
21f90 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61  apshot of databa
21fa0 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79  se zDb currently
21fb0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20   .** being read 
21fc0 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  by handle db..*/
21fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
21fe0 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c  pshot_get(.  sql
21ff0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e  ite3 *db, .  con
22000 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
22010 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22020 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b   **ppSnapshot.){
22030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22040 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65  TE_ERROR;.#ifnde
22050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
22060 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
22070 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
22080 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
22090 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
220a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
220b0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
220c0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
220d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
220e0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
220f0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ..  if( db->auto
22100 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
22110 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
22120 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
22130 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69   zDb);.    if( i
22140 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
22150 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
22160 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Bt = db->aDb[iDb
22170 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
22180 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   0==sqlite3Btree
22190 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
221a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
221b0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
221c0 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29  Trans(pBt, 0, 0)
221d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
221e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
221f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22200 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
22210 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72  otGet(sqlite3Btr
22220 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70  eePager(pBt), pp
22230 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
22240 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22250 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
22260 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
22270 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
22280 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
22290 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
222a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
222b0 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  pen a read-trans
222c0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e  action on the sn
222d0 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65  apshot idendifie
222e0 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a  d by pSnapshot..
222f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
22300 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
22310 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
22320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
22330 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70   .  sqlite3_snap
22340 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a  shot *pSnapshot.
22350 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22360 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
22370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22380 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
22390 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
223a0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
223b0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
223c0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
223d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
223e0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
223f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22400 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
22410 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  );.  if( db->aut
22420 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
22430 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
22440 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
22450 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
22460 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
22470 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
22480 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
22490 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
224a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
224b0 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
224c0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
224d0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
224e0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
224f0 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
22500 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 63 6b 20      int bUnlock 
22510 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
22520 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
22530 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20  nReadTrans(pBt) 
22540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22550 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
22560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22580 61 67 65 72 53 6e 61 70 73 68 6f 74 43 68 65 63  agerSnapshotChec
22590 6b 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73  k(pPager, pSnaps
225a0 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  hot);.          
225b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
225c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
225d0 20 20 20 20 20 62 55 6e 6c 6f 63 6b 20 3d 20 31       bUnlock = 1
225e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
225f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22600 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
22610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22690 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28  gerSnapshotOpen(
226a0 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73 68 6f  pPager, pSnapsho
226b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
226c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
226d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
226e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
226f0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
22700 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
22710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
22720 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28  gerSnapshotOpen(
22730 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
22740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22750 28 20 62 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  ( bUnlock ){.   
22760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
22770 67 65 72 53 6e 61 70 73 68 6f 74 55 6e 6c 6f 63  gerSnapshotUnloc
22780 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
22790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
227a0 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
227b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
227c0 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
227d0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
227e0 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
227f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22800 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73  ecover as many s
22810 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73  napshots as poss
22820 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61  ible from the wa
22830 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  l file associate
22840 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61  d with.** schema
22850 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73 65   zDb of database
22860 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
22870 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63  te3_snapshot_rec
22880 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  over(sqlite3 *db
22890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
228a0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
228b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
228c0 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20  nt iDb;.#ifndef 
228d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
228e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
228f0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
22900 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
22910 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
22920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22930 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
22940 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
22950 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
22960 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
22970 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
22980 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
22990 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30  b);.  if( iDb==0
229a0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
229b0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
229c0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
229d0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
229e0 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
229f0 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
22a00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22a10 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
22a20 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
22a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
22a50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
22a60 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72 28 73  napshotRecover(s
22a70 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
22a80 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20  (pBt));.        
22a90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
22aa0 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  it(pBt);.      }
22ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
22ac0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
22ad0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e  (db->mutex);.#en
22ae0 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  dif   /* SQLITE_
22af0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65  OMIT_WAL */.  re
22b00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22b10 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f  * Free a snapsho
22b20 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65  t handle obtaine
22b30 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73  d from sqlite3_s
22b40 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a  napshot_get()..*
22b50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73  /.void sqlite3_s
22b60 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c  napshot_free(sql
22b70 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
22b80 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c  Snapshot){.  sql
22b90 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73  ite3_free(pSnaps
22ba0 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  hot);.}.#endif /
22bb0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
22bc0 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
22bd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22be0 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
22bf0 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  IAGS./*.** Given
22c00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
22c10 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
22c20 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20  on, return true 
22c30 69 66 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a  if that option.*
22c40 2a 20 77 61 73 20 75 73 65 64 20 61 6e 64 20 66  * was used and f
22c50 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
22c60 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e 20  ** The name can 
22c70 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e  optionally begin
22c80 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22 20   with "SQLITE_" 
22c90 62 75 74 20 74 68 65 20 22 53 51 4c 49 54 45 5f  but the "SQLITE_
22ca0 22 20 70 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e  " prefix.** is n
22cb0 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ot required for 
22cc0 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20  a match..*/.int 
22cd0 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
22ce0 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74  ption_used(const
22cf0 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29   char *zOptName)
22d00 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
22d10 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73  int nOpt;.  cons
22d20 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69  t char **azCompi
22d30 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c  leOpt;. .#if SQL
22d40 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
22d50 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e  RMOR.  if( zOptN
22d60 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76  ame==0 ){.    (v
22d70 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
22d80 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
22d90 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
22da0 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  ..  azCompileOpt
22db0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c   = sqlite3Compil
22dc0 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b  eOptions(&nOpt);
22dd0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ..  if( sqlite3S
22de0 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65  trNICmp(zOptName
22df0 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d  , "SQLITE_", 7)=
22e00 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d  =0 ) zOptName +=
22e10 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   7;.  n = sqlite
22e20 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61  3Strlen30(zOptNa
22e30 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  me);..  /* Since
22e40 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c   nOpt is normall
22e50 79 20 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69  y in single digi
22e60 74 73 2c 20 61 20 6c 69 6e 65 61 72 20 73 65 61  ts, a linear sea
22e70 72 63 68 20 69 73 20 0a 20 20 2a 2a 20 61 64 65  rch is .  ** ade
22e80 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66  quate. No need f
22e90 6f 72 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  or a binary sear
22ea0 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ch. */.  for(i=0
22eb0 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a  ; i<nOpt; i++){.
22ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22ed0 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65  trNICmp(zOptName
22ee0 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69  , azCompileOpt[i
22ef0 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26  ], n)==0.     &&
22f00 20 73 71 6c 69 74 65 33 49 73 49 64 43 68 61 72   sqlite3IsIdChar
22f10 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
22f20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b  azCompileOpt[i][
22f30 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  n])==0.    ){.  
22f40 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22f50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22f60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
22f70 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d  urn the N-th com
22f80 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
22f90 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 69   string.  If N i
22fa0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a  s out of range,.
22fb0 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c  ** return a NULL
22fc0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e   pointer..*/.con
22fd0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
22fe0 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
22ff0 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  et(int N){.  int
23000 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63   nOpt;.  const c
23010 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f  har **azCompileO
23020 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f  pt;.  azCompileO
23030 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  pt = sqlite3Comp
23040 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74  ileOptions(&nOpt
23050 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26 26  );.  if( N>=0 &&
23060 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72   N<nOpt ){.    r
23070 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f  eturn azCompileO
23080 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  pt[N];.  }.  ret
23090 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
230a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
230b0 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
230c0 47 53 20 2a 2f 0a                                GS */.